多線程_TCP編程
阿新 • • 發佈:2017-12-24
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 * 客戶端接口服務器的反饋消息並輸出LoginServer.java14 * 缺點:服務器處理一次用戶請求之後,就關閉了 15 * 應該是服務器一直監聽,可以處理多個用戶的請求 16 * 使用while循環類似達到效果,但是不可以 17 * 不是並行,是串行的。請求一次,只能等待該次請求執行完畢 18 * 19 * 問題:學生1-------咨詢1 學生2---------咨詢1 學 生3------------咨詢1 20 * 21 * 解決: 22 * 學生1------------ ---------------咨詢123 * 學生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 }
客戶端:
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編程