Java中用多线程实现网络编程
要學會Java網絡編程,首先要对網絡通讯知识有一定的初步的了解,如网络OSI七层模型,常用的網絡協議,如tcp/ip,Http,FTP等協議,讀者可以從網上獲取這些知識,來進一步的了解,有助于Java的網絡編程,在此就不講這些內容了.下我們主要看一下如何在Java中進行網絡編程.
?
我們現在來實現一個服務器和多個客戶端時行網絡通訊的功能.
1. 使用Eclipse IDE,首先創建一個java項目:MultiThreadSocket 并讓它繼承Thread類
package pa20110201;import java.net.UnknownHostException;/** * * @author Liyongbin * @date 02-01-2011 * */public class MultiThreadSocket extends Thread{private Socket socket; public MultiThreadSocket (Socket socket){ this.socket=socket; }}
?
2. 在這個類中創建兩個靜態方法: server 和 client,分別模擬服務器端和客戶端
/** * 服務器端 */public static void server(){try {//創建服務器端的套接字(綁定到8000端口上)ServerSocket ss = new ServerSocket(8000);//我循環等待用戶請求while (true) {//返回一個套接字Socket sk =ss.accept();//創建一個線程new MultiThreadSocket(sk).start();}//關閉服務器端套接字//ss.close();} catch (IOException e) {e.printStackTrace();}}/** * 客戶端 */static void client(){try {//直接返回IP//Socket s1 = new Socket(InetAddress.getByName("127.0.0.1"),8000);//輸出流OutputStream os = s1.getOutputStream();//輸入流InputStream is = s1.getInputStream();//定義字節數組byte [] buffer =new byte[1000];//從Buffer中讀取數據int length = is.read(buffer);//將讀取的數打印出來System.out.println(new String (buffer,0,length));//往服務器端發送數據os.write("I'm zhangshan4!".getBytes());//關閉輸出流os.close();//關閉輸入流is.close();//關閉套接字s1.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}?
?
3. 重寫Thread的run方法://運行線程@Override
//運行線程@Overridepublic void run() {try {//往客戶端發送數據OutputStream os = socket.getOutputStream();//從網絡上讀取數據InputStream is = socket.getInputStream();//發送Hello worldos.write("Hello world!".getBytes());//定義字節數組byte [] buffer =new byte[1000];//從Buffer中讀取數據int length = is.read(buffer);//將讀取的數打印出來System.out.println(new String (buffer,0,length));//關閉輸出流os.close();//關閉輸入流is.close();//關閉套接字socket.close();} catch (Exception e) {e.printStackTrace();}}?
?
4. 寫一個測方法
public static void main(String[] args) {if (args.length >0) {server();}else{client();}}??
5. 項目中所要導入的包如下
import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;import java.net.UnknownHostException;?
?
6. 設置啟動項目的參數,如圖所示:
??? 1). 選擇 Run Configurations, 新建兩個啟動項,一個是服務器(MultiThreadSocket _Server),
????????? 另一個是客戶端(MultiThreadSocket _Client)
?
?
?
?? 2).在服務器的啟動項上沒置啟動參數(任意),客端啟動項則勿需設置啟動參數,如圖:
?
?
3).設置成功后如圖所示:
?
?
7.? 設置控制臺的顯示:
?
?
8. 所有的設置均已完成,可以運行程序了,
??? 首先運行服務器端,然後啟動客戶端,服務端只啟動一次,客戶端可啟動多次,運行結果如下:
?
?
?
?
?
?
?