資源簡介
在主線程中通過控制臺讀取鍵盤輸入時,會產(chǎn)生阻塞。故另外開啟一個線程,用于接受客戶端的socket消息。服務器在收到一個socket連接之后,把該socket保存到隊列中,并對隊列中的每個socket開啟各自的讀寫線程。測試可以在不同控制臺運行server和client,服務器接收消息時,會顯示消息來源

代碼片段和文件信息
import?java.net.ServerSocket;
import?java.net.Socket;
import?java.io.DataInputStream;???
import?java.io.DataOutputStream;???
import?java.io.BufferedReader;
import?java.io.InputStreamReader;
public?class?socketClient
{
private?DataOutputStream?output;
private?DataInputStream?input;
private?String?clientName;
public?static?void?main(String[]?args)
{
//在main函數(shù)中,啟動服務器的socket
new?socketClient().ConnectServer();
}
public?void?ConnectServer()
{
try
{
Socket?socket?=?new?Socket(“127.0.0.1“10001);
clientName?=?socket.getInetAddress().toString();
input?=?new?DataInputStream(socket.getInputStream());
output?=?new?DataOutputStream(socket.getOutputStream());
new?readServer().start();
new?writeServer().start();
}
catch(Exception?e) {System.out.println(e.toString());}
}
public?class?readServer?extends?Thread
{
private?Socket?client;
public?void?run()
{
String?msg;
try
{
while(true)
{
msg?=?input.readUTF();
if(msg!=null)
System.out.println(“收到消息:【“+clientName+“】?“+msg);
}
}
catch(Exception?e)?{System.out.println(e.toString());}
}
}
public?class?writeServer?extends?Thread
{
private?Socket?client;
public?void?run()
{
try
{
BufferedReader?stdIn?=?new?BufferedReader(new?InputStreamReader(System.in));
String?userInput;
while(true)
{
if(stdIn.ready())
{
userInput?=?stdIn.readLine();
if(userInput!=“exit“)
{
output.writeUTF(userInput);
System.out.println(“已發(fā)送消息給【“+clientName+“】“+userInput);
}
}
}
}
catch(Exception?e)?{System.out.println(e.toString());}
}
}
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????1778??2012-07-11?16:00??socket通過兩個線程讀寫,可同時收聽多個終端\socketClient.java
?????文件???????2542??2012-07-11?16:24??socket通過兩個線程讀寫,可同時收聽多個終端\socketServer.java
?????目錄??????????0??2012-07-11?16:27??socket通過兩個線程讀寫,可同時收聽多個終端
-----------?---------??----------?-----??----
?????????????????4320????????????????????3
評論
共有 條評論