Javaネットワークプログラミング---------------TCP/IPベース(マルチスレッド加入)


Javaネットワークプログラミング---------------TCP/IPベース(マルチスレッド加入)
1、サーバークラス:
package com.serversocket;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Server_02 {
	//      Socket ArrayList,           
	public static List socketList = Collections.synchronizedList(new ArrayList<>());
	
	public static void main(String[] args) throws IOException {
		
		ServerSocket ss = new ServerSocket(30000);
		
		while(true){
			//       ,          
			Socket s = ss.accept();
			socketList.add(s);
			//              ServerThread         
			new Thread(new ServerThread02(s)).start();
		}
	}
}

2、サーバースレッドクラス
package com.serversocket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class ServerThread02 implements Runnable {
	
	//         Socket
	Socket s = null;
	//       Socket    
	BufferedReader br = null;

	public ServerThread02(Socket s) throws IOException {
		this.s = s;
		//    Socket       
		br = new BufferedReader(new InputStreamReader(s.getInputStream()));
	}

	public void run() {
		try {
			String content = null;
			//        Socket             
			while ((content = readFromClient()) != null) {
				//  socketList    Socket
				//         Socket    
				for (Socket s : Server_02.socketList) {
					PrintStream ps = new PrintStream(s.getOutputStream());
					ps.println(content);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//            
	private String readFromClient() {
		try { 
			return br.readLine();
			//       ,   Socket          
		} catch (IOException e) {
			//   Socket
			Server_02.socketList.remove(s);
		}
		return null;
	}
}

3、クライアントクラス
package com.socket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class Client_02 {

	public static void main(String[] args) throws Exception {
		
		Socket s = new Socket("127.0.0.1",30000);
		
		//     ClientThread02             
		
		new Thread(new ClientThread02(s)).start();
		
		PrintStream ps = new PrintStream(s.getOutputStream());
		
		String line = null;
		System.out.println("     :");
		//         
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		while((line = br.readLine())!=null){
			//            Socket      
			ps.println(line);
		}
	}
}

4、クライアントスレッドクラス
package com.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ClientThread02 implements Runnable {
	//        Socket
	private Socket s = null;
	//      Socket      
	BufferedReader br = null;
	
	public ClientThread02(Socket s) throws IOException{
		this.s = s;
		br = new BufferedReader(new InputStreamReader(s.getInputStream()));
	}
	
	@Override
	public void run() {

		try{
			String content = null;
			//    Socket       ,          
			while((content=br.readLine()) != null){
				System.out.println(content);
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

    上記のコードを作成したら、まずサーバクラスを起動し、次にクライアントクラスを起動します(複数のクライアントクラスを起動できます)