コマンドラインインタフェースのC/Sチャットルームアプリケーション(Socketマルチスレッド実装)
3851 ワード
コマンドラインインタフェースは、Eclipeコンソールでデータを入力します.
サーバ側は複数のスレッドを含む、各Socketは1つのスレッドに対応している.このスレッドは、対応する入力ストリームのデータ(クライアントから送信データ)を読み出し、読み出したデータを各Socket出力ストリームに一度送信(1つのクライアントから送信データを「他のクライアントにブロードキャスト」する)ので、サーバ側でリストを使用してすべてのSocketを保存する必要がある.
以下に、サーバ側の実装コードを示す.プログラムはサーバに2つのクラスを提供し、1つはサーバSocketのリスニングを作成する主クラスであり、1つは各Socket通信を処理するスレッドクラスである.
各クライアントは、ユーザーのキーボード入力を読み取り、ユーザーの入力データをSocket対応の出力ストリームに書き込む2つのスレッドを含む必要があります.1つは、Socketが対応する入力ストリームのデータ(サーバから送信されたデータ)を読み取り、これらのデータを印刷出力する.このうち,ユーザキーボード入力の読み取りを担当するスレッドはMyClinet,すなわちプログラムのメインスレッドが担当する.クライアント・プログラム・コードは次のとおりです.
転載先:https://www.cnblogs.com/wuyida/p/6300350.html
サーバ側は複数のスレッドを含む、各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