- ?
- 作者: ∣來源:天極java∣原文地址∣2006-6-28
-
其實,簡單的分析一下,就可以看出客戶和服務(wù)通訊的主要通道就是Socket本身,而服務(wù)器通過accept方法就是同意和客戶建立通訊.這樣當(dāng)客戶建立Socket的同時。服務(wù)器也會使用這一根連線來先后通訊,那么既然如此只要我們存在多條連線就可以了。那么我們的程序可以變?yōu)槿缦?
服務(wù)器:
import java.io.*; import java.net.*;
public class MyServer { public static void main(String[] args) throws IOException{ ServerSocket server=new ServerSocket(5678); while(true){ Socket client=server.accept(); BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out=new PrintWriter(client.getOutputStream()); while(true){ String str=in.readLine(); System.out.println(str); out.println("has receive...."); out.flush(); if(str.equals("end")) break; } client.close(); } } } |
這里僅僅只是加了一個外層的While循環(huán),這個循環(huán)的目的就是當(dāng)一個客戶進(jìn)來就為它分配一個Socket直到這個客戶完成一次和服務(wù)器的交互,這里也就是接受到客戶的"End"消息.那么現(xiàn)在就實現(xiàn)了多客戶之間的交互了。但是.問題又來了,這樣做雖然解決了多客戶,可是是排隊執(zhí)行的。也就是說當(dāng)一個客戶和服務(wù)器完成一次通訊之后下一個客戶才可以進(jìn)來和服務(wù)器交互,無法做到同時服務(wù),那么要如何才能同時達(dá)到既能相互之間交流又能同時交流呢?很顯然這是一個并行執(zhí)行的問題了。所以線程是最好的解決方案。
那么下面的問題是如何使用線程.首先要做的事情是創(chuàng)建線程并使得其可以和網(wǎng)絡(luò)連線取得聯(lián)系。然后由線程來執(zhí)行剛才的操作,要創(chuàng)建線程要么直接繼承Thread要么實現(xiàn)Runnable接口,要建立和Socket的聯(lián)系只要傳遞引用就可以了.而要執(zhí)行線程就必須重寫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(); } } } |
我的類直接從Thread類繼承了下來.并且通過構(gòu)造函數(shù)傳遞引用和客戶Socket建立了聯(lián)系,這樣每個線程就有了。一個通訊管道.同樣我們可以填寫run方法,把之前的操作交給線程來完成,這樣多客戶并行的Socket就建立起來了。
以上的代碼使用的是
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out=new PrintWriter(client.getOutputStream()); |
還有一種方法是使用
DataInputStream isFromClient = new DataInputStream(client.getInputStream()); DataOutputStream osToClient = new DataOutputStream(client.getOutputStream()); |
關(guān)于這兩種輸入輸出流的不同,我也只知道前一種對字符串支持比較好,后面對于讀取一個字符串需要處理,但是可以支持很多種類型的輸出。對于傳遞字符串而言前一種應(yīng)該是很好的選擇了。
posted on 2006-07-01 09:38
磐石 閱讀(312)
評論(0) 編輯 收藏