1. 程式人生 > >多線程_TCP編程

多線程_TCP編程

sta 信息 客戶 操作 sys 問題 訪問者 ring .get

java源碼示例展示:

服務端:

技術分享圖片
 1 package tcp2;
 2 
 3 import java.io.IOException;
 4 import java.net.InetAddress;
 5 import java.net.ServerSocket;
 6 import java.net.Socket;
 7 
 8 /**
 9  * 登錄的服務器
10  * @author superdrew 
11  *     TCP 登錄 
12  *    功能:用戶在客戶端輸入用戶名和密碼提交給服務器,服務器接收並處理,處理完後給客戶端一個返回信息
13  *        客戶端接口服務器的反饋消息並輸出
14 * 缺點:服務器處理一次用戶請求之後,就關閉了 15 * 應該是服務器一直監聽,可以處理多個用戶的請求 16 * 使用while循環類似達到效果,但是不可以 17 * 不是並行,是串行的。請求一次,只能等待該次請求執行完畢 18 * 19 * 問題:學生1-------咨詢1 學生2---------咨詢1 學 生3------------咨詢1 20 * 21 * 解決: 22 * 學生1------------ ---------------咨詢1
23 * 學生2 ------------ 前臺接待 ---------------咨詢2 24 * 學生3------------ ----------------咨詢3 25 * 26 * 使用線程來處理 27 */ 28 public class LoginServer { 29 public static void main(String[] args) throws IOException { 30 //1.創建一個serversocket 創建服務 31 @SuppressWarnings("resource")
32 ServerSocket serverSocket = new ServerSocket(8888);//端口 8888 IP地址是本機 33 int i =1; 34 while(true){ 35 Socket socket = serverSocket.accept(); 36 InetAddress ia = socket.getInetAddress(); 37 new LoginThread(socket).start(); 38 System.out.println("第"+ i++ +"個人來訪問,訪問者ip是:"+ia.getHostAddress()); 39 } 40 } 41 }
LoginServer.java

客戶端:

技術分享圖片
 1 package tcp2;
 2 
 3 import java.io.DataInputStream;
 4 import java.io.DataOutputStream;
 5 import java.io.IOException;
 6 import java.io.OutputStream;
 7 import java.net.InetAddress;
 8 import java.net.Socket;
 9 import java.net.UnknownHostException;
10 import java.util.Scanner;
11 
12 /**
13  * 登錄的客戶端
14  * @author superdrew
15  *
16  */
17 public class LoginClient {
18     public static void main(String[] args) throws UnknownHostException, IOException {
19         //1.創建一個socket  連接服務器
20         Socket socket = new Socket(InetAddress.getLocalHost(), 8888);//必須要知道服務器IP和端口號
21         @SuppressWarnings("resource")
22         Scanner sc = new Scanner(System.in);
23         //2.通過 socket 發送數據給服務器
24         //OutputStream os = new FileOutputStream("d:/b.txt");輸出到文件
25         System.out.println("請輸入登入信息:");
26         String info = sc.nextLine();
27         OutputStream os = socket.getOutputStream();
28         DataOutputStream dos = new DataOutputStream(os);
29         dos.writeUTF(info);
30         //3.接收服務器返回的消息
31         DataInputStream dis = new DataInputStream(socket.getInputStream());
32         String result = dis.readUTF();
33         System.out.println("服務器返回的消息response:"+result);
34         
35         //4.關閉資源
36         dis.close();
37         dos.close();
38         socket.close();
39     }
40 }
LoginClient.java

多人登入的線程:

技術分享圖片
 1 package cn.com.sxt.tcp2;
 2 
 3 import java.io.DataInputStream;
 4 import java.io.DataOutputStream;
 5 import java.io.IOException;
 6 import java.io.InputStream;
 7 import java.net.Socket;
 8 
 9 /**
10  * 登錄線程
11  * @author superdrew
12  *
13  */
14 public class LoginThread extends Thread{
15     private Socket socket;
16     
17     public void setSocket(Socket socket){
18         this.socket = socket;
19     }
20     
21     public LoginThread(Socket socket){
22         this.socket = socket;
23     }
24     
25     public void run() {
26         InputStream is;
27         DataOutputStream dos = null;
28         DataInputStream dis = null;
29         
30         try {
31             is = socket.getInputStream();
32             dis = new DataInputStream(is);
33             String result = dis.readUTF();
34             System.out.println("客戶端發送來的消息:"+result);
35             //4.給客戶端反饋一個消息 
36             dos = new DataOutputStream(socket.getOutputStream());
37             if("superdrew".equals(result)){
38                 dos.writeUTF("登錄成功");
39             }else{
40                 dos.writeUTF("登錄失敗");
41             }
42         } catch (IOException e) {
43             e.printStackTrace();
44         }finally{
45             try {
46                 if(dos!=null){
47                     dos.close();//關閉dos
48                 }
49             } catch (IOException e) {
50                 e.printStackTrace();
51             }
52             try {
53                 if(dis!=null){
54                     dis.close();//關閉dis
55                 }
56             } catch (IOException e) {
57                 e.printStackTrace();
58             }
59             try {
60                 if(socket!=null){
61                     socket.close();//關閉socket
62                 }
63             } catch (IOException e) {
64                 e.printStackTrace();
65             }
66         }
67         
68     }
69 }
LoginThread.java

操作步驟:

①運行服務端;②運行客戶端;③輸入登入信息為superdrew;④在console窗口下點擊技術分享圖片,可以看到這是第幾次登入以及相關記錄的信息;

結果展示---如圖:

技術分享圖片

技術分享圖片

多線程_TCP編程