天天看點

多線程、socket、全局靜态變量、聊天室

本程式雖然不是很完善,但是基本要求達到了。

功能:實作多個人同時聊天。類似于群聊天室

Java代碼

多線程、socket、全局靜态變量、聊天室
多線程、socket、全局靜态變量、聊天室
多線程、socket、全局靜态變量、聊天室
  1. package com.xiva.bean;  
  2. import java.io.*;  
  3. import java.net.ServerSocket;  
  4. import java.net.Socket;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7. public class SocketServer {  
  8.     public static List<Socket> socketList = new ArrayList<Socket>();  
  9.     public static int number = 0;  
  10.     public static void main(String[] args) {  
  11.         try{  
  12.                     //綁定服務端在8080端口  
  13.             ServerSocket server = new ServerSocket(8080);  
  14.             Socket socket;  
  15.             int count = 0;  
  16.             while (true) {  
  17.                 //監聽用戶端程式  
  18.                 socket = server.accept();  
  19.                 count = count + 1;  
  20.                 System.out.println(socket.getInetAddress().getHostAddress());  
  21.                 //一個用戶端連接配接後啟動一個線程進行監聽用戶端消息  
  22.                 ReadThread readThread = new ReadThread(socket);  
  23.                 readThread.start();  
  24.                 socketList.add(socket);  
  25.             }  
  26.         } catch(IOException e){  
  27.             e.printStackTrace();  
  28.         }  
  29.     }  
  30. }  
  31. class ThreadSocketServer extends Thread {  
  32.     Socket server;  
  33.     public ThreadSocketServer(){  
  34.     }  
  35.     public ThreadSocketServer(Socket s) {  
  36.         this.server = s;  
  37.     }  
  38.     public void run() {  
  39.         try {  
  40.             BufferedReader br = new BufferedReader(new InputStreamReader(  
  41.                     System.in));  
  42.             PrintWriter pw = new PrintWriter(server.getOutputStream());  
  43.             //循環發送資訊給用戶端  
  44.             while (true) {  
  45.                 String s = br.readLine();  
  46.                 pw.println(s);  
  47.                 pw.flush();  
  48.                 System.out.println("Server:" + s);  
  49.             }  
  50.         } catch (IOException e) {  
  51.             e.printStackTrace();  
  52.         }  
  53.     }  
  54. }  
  55. class ReadThread extends Thread {  
  56.     private Socket socket;  
  57.     public ReadThread(Socket socket){  
  58.         this.socket = socket;  
  59.     }  
  60.     public void run() {  
  61.         try {  
  62.             BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  63.             String read=new String();  
  64.             //循環接受用戶端資訊  
  65.             while(true)  
  66.             {  
  67.                 read=br.readLine();  
  68.                 System.out.println(socket.getInetAddress().getHostAddress() +"client說:"+read);  
  69.                 ArrayList<Socket> socketList = SocketServer.socketList;  
  70.                 for(int i = 0; i < socketList.size(); i ++){  
  71.                     Socket socket = socketList.get(i);  
  72.                     PrintWriter pw = new PrintWriter(socket.getOutputStream());  
  73.                     pw.println(read);  
  74.                     pw.flush();  
  75.                 }  
  76.                 if(read.equals("bye"))  
  77.                 {  
  78.                     break;  
  79.                 }  
  80.             }  
  81.             br.close();  
  82.             socket.close();  
  83.         } catch (IOException e) {  
  84.             // TODO Auto-generated catch block  
  85.             e.printStackTrace();  
  86.         }  
  87.     }  
  88. }  

[java] view plain copy print ?

  1. package com.xiva.bean;  
  2. import java.io.*;  
  3. import java.net.ServerSocket;  
  4. import java.net.Socket;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7. public class SocketServer {  
  8.     public static List<Socket> socketList = new ArrayList<Socket>();  
  9.     public static int number = 0;  
  10.     public static void main(String[] args) {  
  11.         try{  
  12.                     //綁定服務端在8080端口  
  13.             ServerSocket server = new ServerSocket(8080);  
  14.             Socket socket;  
  15.             int count = 0;  
  16.             while (true) {  
  17.                 //監聽用戶端程式  
  18.                 socket = server.accept();  
  19.                 count = count + 1;  
  20.                 System.out.println(socket.getInetAddress().getHostAddress());  
  21.                 //一個用戶端連接配接後啟動一個線程進行監聽用戶端消息  
  22.                 ReadThread readThread = new ReadThread(socket);  
  23.                 readThread.start();  
  24.                 socketList.add(socket);  
  25.             }  
  26.         } catch(IOException e){  
  27.             e.printStackTrace();  
  28.         }  
  29.     }  
  30. }  
  31. class ThreadSocketServer extends Thread {  
  32.     Socket server;  
  33.     public ThreadSocketServer(){  
  34.     }  
  35.     public ThreadSocketServer(Socket s) {  
  36.         this.server = s;  
  37.     }  
  38.     public void run() {  
  39.         try {  
  40.             BufferedReader br = new BufferedReader(new InputStreamReader(  
  41.                     System.in));  
  42.             PrintWriter pw = new PrintWriter(server.getOutputStream());  
  43.             //循環發送資訊給用戶端  
  44.             while (true) {  
  45.                 String s = br.readLine();  
  46.                 pw.println(s);  
  47.                 pw.flush();  
  48.                 System.out.println("Server:" + s);  
  49.             }  
  50.         } catch (IOException e) {  
  51.             e.printStackTrace();  
  52.         }  
  53.     }  
  54. }  
  55. class ReadThread extends Thread {  
  56.     private Socket socket;  
  57.     public ReadThread(Socket socket){  
  58.         this.socket = socket;  
  59.     }  
  60.     public void run() {  
  61.         try {  
  62.             BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  63.             String read=new String();  
  64.             //循環接受用戶端資訊  
  65.             while(true)  
  66.             {  
  67.                 read=br.readLine();  
  68.                 System.out.println(socket.getInetAddress().getHostAddress() +"client說:"+read);  
  69.                 ArrayList<Socket> socketList = SocketServer.socketList;  
  70.                 for(int i = 0; i < socketList.size(); i ++){  
  71.                     Socket socket = socketList.get(i);  
  72.                     PrintWriter pw = new PrintWriter(socket.getOutputStream());  
  73.                     pw.println(read);  
  74.                     pw.flush();  
  75.                 }  
  76.                 if(read.equals("bye"))  
  77.                 {  
  78.                     break;  
  79.                 }  
  80.             }  
  81.             br.close();  
  82.             socket.close();  
  83.         } catch (IOException e) {  
  84.             // TODO Auto-generated catch block  
  85.             e.printStackTrace();  
  86.         }  
  87.     }  
  88. }  

不用說了上面是socket的server端。

标題中提到了,全局靜态變量;就是上面程式中的socketList。用來存儲每一個連接配接到server端的socket.

在read線程中,同時向所有的client端發送資訊。

其中類ThreadSocketServer ,可以啟動用來和使用者一對一的對話。

Java代碼

多線程、socket、全局靜态變量、聊天室
多線程、socket、全局靜态變量、聊天室
多線程、socket、全局靜态變量、聊天室
  1. package com.xiva.bean;  
  2. import java.io.*;  
  3. import java.net.*;  
  4. public class TalkClient {  
  5.     public static void main(String args[]) {  
  6.         try{  
  7.             Socket socket=new Socket("192.168.0.64",8080);  
  8.             ReadString read = new ReadString(socket);  
  9.             read.start();  
  10.             BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));  
  11.             PrintWriter os=new PrintWriter(socket.getOutputStream());  
  12.             String readline=sin.readLine();  
  13.             while(!readline.equals("bye")){  
  14.                 os.println(readline);  
  15.                 os.flush();  
  16.                 System.out.println("Client:"+readline);  
  17.                 readline=sin.readLine();  
  18.             }  
  19.             os.close();  
  20.             socket.close();  
  21.         }catch(Exception e) {  
  22.             System.out.println("Error"+e);  
  23.         }  
  24.     }  
  25. }  
  26. class ReadString extends Thread {  
  27.     private Socket socket;  
  28.     public ReadString(Socket socket){  
  29.         this.socket = socket;  
  30.     }  
  31.     public void run() {  
  32.         try {  
  33.             BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  34.             //循環接受服務端資訊  
  35.             while(true)  
  36.             {  
  37.                 String read = is.readLine();  
  38.                 System.out.println("Server:"+read);  
  39.                 if(read.equals("bye"))  
  40.                 {  
  41.                     break;  
  42.                 }  
  43.             }  
  44.             is.close();  
  45.             socket.close();  
  46.         } catch (IOException e) {  
  47.             e.printStackTrace();  
  48.         }  
  49.     }  
  50. }  

[java] view plain copy print ?

多線程、socket、全局靜态變量、聊天室
多線程、socket、全局靜态變量、聊天室
  1. package com.xiva.bean;  
  2. import java.io.*;  
  3. import java.net.*;  
  4. public class TalkClient {  
  5.     public static void main(String args[]) {  
  6.         try{  
  7.             Socket socket=new Socket("192.168.0.64",8080);  
  8.             ReadString read = new ReadString(socket);  
  9.             read.start();  
  10.             BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));  
  11.             PrintWriter os=new PrintWriter(socket.getOutputStream());  
  12.             String readline=sin.readLine();  
  13.             while(!readline.equals("bye")){  
  14.                 os.println(readline);  
  15.                 os.flush();  
  16.                 System.out.println("Client:"+readline);  
  17.                 readline=sin.readLine();  
  18.             }  
  19.             os.close();  
  20.             socket.close();  
  21.         }catch(Exception e) {  
  22.             System.out.println("Error"+e);  
  23.         }  
  24.     }  
  25. }  
  26. class ReadString extends Thread {  
  27.     private Socket socket;  
  28.     public ReadString(Socket socket){  
  29.         this.socket = socket;  
  30.     }  
  31.     public void run() {  
  32.         try {  
  33.             BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  34.             //循環接受服務端資訊  
  35.             while(true)  
  36.             {  
  37.                 String read = is.readLine();  
  38.                 System.out.println("Server:"+read);  
  39.                 if(read.equals("bye"))  
  40.                 {  
  41.                     break;  
  42.                 }  
  43.             }  
  44.             is.close();  
  45.             socket.close();  
  46.         } catch (IOException e) {  
  47.             e.printStackTrace();  
  48.         }  
  49.     }  
  50. }  

用戶端程式,在于啟動一個線程監視server端傳過來的message,同時可以不斷的發送資訊給server端。

這樣多人聊天室,便實作了。

擴充方向,可以在list中綁定其他資訊,比如userInfo。當用戶端連接配接時,發送給用戶端有哪些其它客戶線上。同樣綁定了userInfo後,這樣就可以for循環時,判斷線程中和那個使用者綁定了,也不需要得到線程裡面的具體資訊了。這樣一對一的聊天也很容易就實作了,這些隻要有了這個主幹下面的程式就好延伸了。

還有需要注意的就是線程存在的時間,我們可能需要寫一個定時器,不斷喚醒程式,以及讓其睡眠