Posted on 2008-09-20 08:57
魚躍于淵 閱讀(92)
評論(0) 編輯 收藏 所屬分類:
精品網摘
[摘要] 其實,簡單的分析一下,就可以看出客戶和服務通訊的主要通道就是Socket本身,而服務器通過accept方法就是同意和客戶建立通訊.這樣當客戶建立Socket的同時。服務器也會使用這一根連線來先后通訊,那么既然如此只要我們存在多條連線就可以了。
[關鍵字] Socket 網絡編程
其實,簡單的分析一下,就可以看出客戶和服務通訊的主要通道就是Socket本身,而服務器通過accept方法就是同意和客戶建立通訊.這樣當客戶建立Socket的同時。服務器也會使用這一根連線來先后通訊,那么既然如此只要我們存在多條連線就可以了。那么我們的程序可以變為如下:
那么下面的問題是如何使用線程.首先要做的事情是創建線程并使得其可以和網絡連線取得聯系。然后由線程來執行剛才的操作,要創建線程要么直接繼承Thread要么實現Runnable接口,要建立和Socket的聯系只要傳遞引用就可以了.而要執行線程就必須重寫run方法,而run方法所做的事情就是剛才單線程版本main所做的事情,因此我們的程序變成了這樣:
import java.net.*;
import java.io.*;
public class MultiUser extends Thread{
private Socket client;
public MultiUser(Socket c){
this.client=c;
}
public void run(){
try{
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out=new PrintWriter(client.getOutputStream());
//Mutil User but can parallel
while(true){
String str=in.readLine();
System.out.println(str);
out.println("has receive....");
out.flush();
if(str.equals("end"))
break;
}
client.close();
}catch(IOException ex){
}finally{
}
}
public static void main(String[] args)throws IOException{
ServerSocket server=new ServerSocket(5678);
while(true){
//transfer location change Single User or Multi User
MultiUser mu=new MultiUser(server.accept());
mu.start();
}
}
}
客戶端代碼:
import Java.net.*;
import Java.io.*;
public class Client{
static Socket Server;
public static void main(String[] args) throws Exception
{
Server=new Socket (InetAddress.getLocalHost(),5678);
BufferedReader in=new BufferedReader(new InputStreamReader(Server.getInputStream()));
PrintWriter out=new PrintWriter(Server.getOutputStream());
BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));
while(true)
{
String str=wt.readLine();
out.println(str);
out.flush();
if(str.equals("end"))
{
break;
}
System.out.println(in.readLine());
}
Server.close();
}
}
這段程序是接受客戶的鍵盤輸入,并把信息輸出到服務端。并把"end"作為退出的命令
以上程序完成了兩臺計算機的簡單通信。