본문 바로가기
JAVA

[JAVA] Server Socket 서버 클라이언트 프로그램 만들기

by KhyeonS 2022. 8. 8.

서버프로그램에서 소켓이 가장 중요!

소켓은 아이피 번호와 포트번호를 합친 것

 

CMD로 아이피주소 확인 후 아이피 주소 입력

 

package Ser_Cli1;
import java.net.*;
import java.io.IOException;
public class MySer extends Thread {
	ServerSocket ss;
	public MySer() {  // 생성자 
		try {
			ss= new ServerSocket(3000); //3000은 포트번호
			System.out.println("Server ready...");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	@Override
	public void run() {
		while (true) {
			try {
				Socket s = ss.accept();  // 클라이언트의 요청을 받음
				String ip = s.getInetAddress().getHostAddress(); // 접속한 클라이언트의 IP
				System.out.println(ip+"님이 왔다감!!");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		MySer ms = new MySer();
		ms.start();
	}

}
package Ser_Cli1;
import java.net.*;
import java.io.IOException;
import java.net.UnknownHostException;
public class MyCli {
	public static void main(String[] args) 
			throws UnknownHostException, IOException{
		Socket s=new Socket("192.168.93.1", 3000); // IP_주소와 포트를 넣어서 서버에 접속
		
	}

}


public class My_Server extends Thread {
	ServerSocket ss;
	public My_Server() {
		try {
			ss= new ServerSocket(3001);
			System.out.println("서버시작....");
		} catch (Exception e) {
	}
}
	public static void main(String[] args) {
		new My_Server().start();
	}
	@Override
	public void run() {
		while (true) {
			try {
				Socket s = ss.accept();   // 클라이언트를 계속 기다림 
				BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
				String msg = reader.readLine();
				String ip = s.getInetAddress().getHostAddress();
				System.out.println(ip+ ":"+msg);
			} catch (Exception e) {
			}
			
		}
	}

}
package Ser_Cli2;

import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class My_Client {
	public static void main(String[] args) {
		System.out.println("입력: ");
		Scanner scan = new Scanner(System.in);
		String msg = scan.nextLine();
		if (msg != null&& msg.trim().length()>0) {
			Socket s =null;
			try {
				s = new Socket("192.168.93.1", 3001);
				PrintWriter out =new PrintWriter(s.getOutputStream());
				out.write(msg);
				out.flush();
				if (out != null) {
					out.close();
					
				}
			} catch (Exception e) {
			}finally {
				try {
					if (s != null) {
						s.close();
					}
				} catch (Exception e2) {
				}
			}
			
		}
	}

}


채팅서버 구축 및 클라이언트 생성

package Chats;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatSer extends Thread {
	ServerSocket ss;
	public ChatSer() {
		try {
			ss= new ServerSocket(3200);
			System.out.println("채팅 서버 시작.....");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		new ChatSer().start();  //  Thread를 상속받은 CharSer이므로 바로 start() 메써드 사용 가능
	}
	@Override
	public void run() {
		while (true) {
			try {
				Socket s = ss.accept();
				String ip = s.getInetAddress().getHostAddress();
				System.out.println(ip + "님 접속 했습니다");
			} catch (Exception e) {
			}
		
		}
	}

}

package Chats;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class ChatCli1 extends JFrame implements Runnable{    // JFrame 화면 구현
	JTextArea area;
	JTextField input;
	JButton send_bt;
	JPanel south_p;
	Socket s;
	BufferedReader in;
	PrintWriter out;
	Thread t;
	public ChatCli1() {
		area =new JTextArea();
		this.add(area);
		south_p =new JPanel(new BorderLayout());
		south_p.add(input=new JTextField());
		south_p.add(send_bt=new JButton("보내기"), BorderLayout.EAST);
		this.add(south_p, BorderLayout.SOUTH);
		this.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				out.println("xx: ~ X");
			}
		});
		send_bt.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent args0) {
				sendData();  // 서버로 메시지 전달 메써드
			}
		});
		setBounds(100, 100, 400, 500);
		setVisible(true);
		connected();  // 서버 접속
		t = new Thread(this);
		t.start();
	}
	private void connected(){
		try {		
			// 서버 접속
			s = new Socket("192.168.10.244", 3200);
			in = new BufferedReader(new InputStreamReader(s.getInputStream()));
			out = new PrintWriter(s.getOutputStream(), true);
		} catch (Exception e) {
		}
	}
	public static void main(String[] args) {
		new ChatCli1();
	}
	@Override
	public void run() {
		// 서버로부터 전달되는 메세지를 기다렸다가
		// 메세지가 도착하면 화면에 출력
		while (true) {
			try {
String msg = in.readLine(); // 대기상태
				if (msg.equals("xx:~X"))		
					break;
				if (msg != null)
					area.append(msg+"\r\n");
			} catch (Exception e) {
				
			}
		}
		closed(); //열려있는 스트림을 닫는 메서드
		System.exit(0); // 프로그램 종료!!
	}
	private void sendData() {
		String msg = input.getText().trim();
		if (msg.length() > 0) {
			// 한 글자라도 입력했을 때 서버로 보내기
			out.println(msg);
		}
		input.setText(""); //청소!!
	}
	private void closed(){
		try {
			if(out != null)
				out.close();
			if(in != null)
				in.close();
			if(s != null)
				s.close();
		} catch (Exception e) {
		}
	}
}

 

'JAVA' 카테고리의 다른 글

[JAVA] 문제 풀이 0809  (0) 2022.08.09
[JAVA] JDBC  (0) 2022.08.09
[JAVA] IO < 버퍼>, < byte stream>, <Char stream>  (0) 2022.08.08
[JAVA]file class  (0) 2022.08.08
[JAVA] IO(Input/Output)  (0) 2022.08.03

댓글