コマンドラインインタフェースのC/Sチャットルームアプリケーション(Socketマルチスレッド実装)

3851 ワード

コマンドラインインタフェースは、Eclipeコンソールでデータを入力します.
サーバ側は複数のスレッドを含む、各Socketは1つのスレッドに対応している.このスレッドは、対応する入力ストリームのデータ(クライアントから送信データ)を読み出し、読み出したデータを各Socket出力ストリームに一度送信(1つのクライアントから送信データを「他のクライアントにブロードキャスト」する)ので、サーバ側でリストを使用してすべてのSocketを保存する必要がある.
 
以下に、サーバ側の実装コードを示す.プログラムはサーバに2つのクラスを提供し、1つはサーバSocketのリスニングを作成する主クラスであり、1つは各Socket通信を処理するスレッドクラスである.
package com.net.scday1;

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

public class MyServer {
	//      Socket ArrayList
	public static ArrayList scoketList=new ArrayList();
	public static void main(String[] args) {
		
		try {
			ServerSocket ss=new ServerSocket(30000);
			while (true) {
				//      ,          
				Socket s=ss.accept();
				scoketList.add(s);
				//            ServerThread         
				new Thread(new ServerThread(s)).start();
			} 
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
	}

}


 
package com.net.scday1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
/**
 *               
 * @author yulei
 *
 */
public class ServerThread  implements Runnable{
	//          Socket
	Socket s=null;
	//      Socket       
	BufferedReader br=null;
	public ServerThread(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:MyServer.scoketList){
				PrintStream ps=new PrintStream(s.getOutputStream());
				ps.println(content);
			}
		}
		} catch (Exception e) {
		}
	}
	
	//            
	private String readFromClient(){
		try {
			return br.readLine();
			//       ,   Socket          
		} catch (IOException e) {
			//   Socket
			MyServer.scoketList.remove(s);
		}
		return null;
	}
}

各クライアントは、ユーザーのキーボード入力を読み取り、ユーザーの入力データをSocket対応の出力ストリームに書き込む2つのスレッドを含む必要があります.1つは、Socketが対応する入力ストリームのデータ(サーバから送信されたデータ)を読み取り、これらのデータを印刷出力する.このうち,ユーザキーボード入力の読み取りを担当するスレッドはMyClinet,すなわちプログラムのメインスレッドが担当する.クライアント・プログラム・コードは次のとおりです.
package com.net.scday1;

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

public class MyClient {
	
	public static void main(String[] args) throws Exception {
		Socket s=new Socket("127.0.0.1",30000);
		//     ClientThread              
		new Thread(new ClientThread(s)).start();
		//   Socket      
		PrintStream ps=new PrintStream(s.getOutputStream());
		String line=null;
		//        
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		while((line=br.readLine())!=null){
			if(""==line||"".equals(line.trim())){
				System.out.println("        !");
			}else{
			//            Socket      
			ps.println(line);
		}
	 }
	}
}
package com.net.scday1;

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

public class ClientThread  implements Runnable{
	//        Socket
	private Socket s;
	//       Socket       
	BufferedReader br=null;
	public  ClientThread(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 (Exception e) {
		}
	}
}

 
 

 
 
 
転載先:https://www.cnblogs.com/wuyida/p/6300350.html