본문 바로가기

JAVA/기초 프로그래밍

문자열을 전송받아 다른 클라이언트에게 문자열을 보내기

Server

-dto 생성 : 전달 할 내용인 number, name, play 기본정렬;

-vector로 소켓을 담아 클라이언트들 ip를 저장

-play번호가 1일때 2로 바꾸거, 2일때 1로바꿔 sendMsg메서드로 메세지보내기

 

 

 

 

Client

-dto 생성 : 받고 전달할 변수들 기본정렬;

- JFrame 상속받은 id클래스에서 

 

 

 

 

 

Main

package main;
public class mainClass {
	public static void main(String[] args) {
		
		ServerSocket server = null;
		Socket socket =null;		
		
		//클라이언트와 연결된 소켓들을 배열처럼 저장할 벡터객체 생성
		Vector<Socket> vec = new Vector<Socket>();
		
		try{
			server= new ServerSocket(9000);
			
			while(true){
				System.out.println("접속대기중..");				
				
				socket = server.accept();
				
				//클라이언트와 연결된 소켓을 벡터에 담기
				vec.add(socket);
				
				//스레드 구동
				new EchoThread(socket, vec).start();
			}
		}catch(IOException ie){
			System.out.println(ie.getMessage());
		}
	}
}

 

 

EchoThread

package thread;

//클라이언트로 부터 전송된 문자열을 받아서 다른 클라이언트에게 문자열을
//보내주는 스레드
public class EchoThread extends Thread{
	
	Socket socket;
	Vector<Socket> vec;
			
	public EchoThread(Socket socket, Vector<Socket> vec){
		this.socket = socket;
		this.vec = vec;			
	}
	public void run(){		
		NetworkSerialize ns = null;
		try{						
			while(true){
				ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());		
				try{					
					ns = (NetworkSerialize) ois.readObject();
					
					System.out.println("네트워크 전송된 객체는 " +ns.toString());										
				}catch(ClassNotFoundException e){}
				
				//상대가 접속을 끊으면 break;
				if(ns==null){
					//벡터에서 없애기
					vec.remove(socket);
					break;
				}
				//연결된 소켓들을 통해서 다른 클라이언트에게  보내주기					
				if(ns.getPlay() == 1) ns.setPlay(2);
				else		ns.setPlay(1);
				sendMsg(ns);					
			}
		} catch(IOException ie){
			System.out.println(ie.getMessage());
		}
	}
	
	//전송받은 문자열 다른 클라이언트들에게 보내주는 메서드
	public void sendMsg(NetworkSerialize ns){
		int num = 0;
				
		try{			
			for(Socket socket:vec){
				//for를 돌되 현재의 socket이 데이터를 보낸 클라이언트인 경우를 제외하고 
				//나머지 socket들에게만 데이터를 보낸다.
			//	if(socket != this.socket){				
					ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
					num++;
					ns.setNumber(num);								
					oos.writeObject(ns);
					oos.flush();				
					//단,여기서 얻어온 소켓들은 남의것들이기 때문에 여기서 닫으면 안된다.
			//	}
			}
		}catch(IOException ie){
			System.out.println(ie.getMessage());
		}		
	}
}

 

NetworkSerialize

package dto;
public class NetworkSerialize implements Serializable {
	private int number;
	private String name;
	private int play;
	
	public NetworkSerialize() {
	}

	public NetworkSerialize(int number, String name, int play) {
		super();
		this.number = number;
		this.name = name;
		this.play = play;
	}
	@Override
	public String toString() {
		return "NetworkSerialize [number=" + number + ", name=" + name + ", play=" + play + "]";
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPlay() {
		return play;
	}
	public void setPlay(int play) {
		this.play = play;
	}
}

 

 


main

package main;

public class mainClass {
	public static void main(String[] args) {
		Socket socket=null;
		ClientFrame cf;
		
		try{
			socket=new Socket("168.192.7.40",9000);
			System.out.println("연결성공!");
			
			cf = new ClientFrame(socket);
			
			new ReadThread(socket, cf).start();
			
		}catch(IOException ie){
			System.out.println(ie.getMessage());
		}
	}
}

 

ReadThread

package thread;
public //서버가 보내온 문자열을 전송받는 스레드
class ReadThread extends Thread{
	
	Socket socket;
	ClientFrame cf;
	
	public ReadThread(Socket socket, ClientFrame cf) {
		this.cf = cf;
		this.socket=socket;
	}
	public void run() {	
		NetworkSerialize ns = null;
		try{
			//서버로부터 전송된 문자열 읽어오기 위한 스트림객체 생성			
			while(true){
				ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
				//소켓으로부터 문자열 읽어옴
				try{
					ns = (NetworkSerialize)ois.readObject();
					
					SingletonClass sc = SingletonClass.getInstance();
					sc.ns = ns;
					
					cf.txtA.append("---------" + ns.toString()+"\n");
					
				}catch(ClassNotFoundException e){}
	
				if(ns==null){
					System.out.println("접속이 끊겼음");
					break;
				}				
			}
		}catch (UnknownHostException e) 
		{
		}catch(IOException ie){
			System.out.println(ie.getMessage());
		}
	}
}

 

NetworkSerialize

package dto;
import java.io.Serializable;

public class NetworkSerialize implements Serializable {
	private int number;
	private String name;
	private int play;
	
	public NetworkSerialize() {
	}
	public NetworkSerialize(int number, String name, int play) {
		super();
		this.number = number;
		this.name = name;
		this.play = play;
	}
	@Override
	public String toString() {
		return "NetworkSerialize [number=" + number + ", name=" + name + ", play=" + play + "]";
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPlay() {
		return play;
	}
	public void setPlay(int play) {
		this.play = play;
	}
}

 

SingletonClass

package view;
import dto.NetworkSerialize;

public class SingletonClass {
	private static SingletonClass singleton = new SingletonClass(); 
	public NetworkSerialize ns;

	//아래와같이 생성자가 private로 두어서 메인에서 생성할 수 없게 합니다. 
	private SingletonClass(){ 
		ns = new NetworkSerialize(1, "id", 1);
	} 

	//클래스 메소드로 딱 하나 만든 클래스변수를 반환하게 합니다. 
	public static SingletonClass getInstance(){ 
		return singleton; 
	}
}

 

IdClass

package view;
public class IdClass extends JFrame implements ActionListener{
	static JTextField tf = new JTextField(8);
	JButton btn = new JButton("입력");	
	
	WriteThread wt;	
	ClientFrame cf;
	
	public IdClass(){}
	public IdClass(WriteThread wt, ClientFrame cf) {
		super("아이디");		
		this.wt = wt;
		this.cf = cf;		
		
		setLayout(new FlowLayout());
		add(new JLabel("아이디"));
		add(tf);
		add(btn);
		
		btn.addActionListener(this);
		
		setBounds(300, 300, 250, 100);
		setVisible(true);
	}
	
	public void actionPerformed(ActionEvent e) {		
		wt.sendMsg();	
		cf.isFirst = false;
		cf.setVisible(true);
		this.dispose();
	}
	
	static public String getId(){
		return tf.getText();
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'JAVA > 기초 프로그래밍' 카테고리의 다른 글

ID입력받아 채팅창에서 채팅하기  (0) 2020.06.16
쓰레드 기본개념  (0) 2020.06.15
쓰레드//어레이리스트//채팅  (0) 2020.06.15
쓰레드// Object  (0) 2020.06.15
쓰레드 예)  (0) 2020.06.15