標籤:throws 對象 代碼 ring blog puts 輸入資料流 super throw
java聊天室 1、概述
基於tcp協議的,由一個伺服器和多個用戶端組成,一個用戶端發送訊息,其他所有用戶端都能接收到訊息。在伺服器端設定一個線程監聽用戶端發來的請求(訊息),並且向所有的用戶端響應。每個用戶端也有一個線程用來接收伺服器端的請求。
2、代碼如下
public class Client { public static void main(String[] args) throws IOException { //建立通訊端 Socket socket = new Socket("localhost",81); //擷取通訊端的輸出資料流 BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); //啟動線程監聽接收伺服器端的訊息 new Thread(new ClientMessage(socket)).start(); Scanner sc = new Scanner(System.in); //用戶端發送訊息 while(true){ String msg = sc.nextLine(); if("exit".equals(msg)){ break; } byte[] b = msg.getBytes(); bos.write(b, 0, b.length); bos.flush(); } bos.close(); socket.close(); }}class ClientMessage implements Runnable{ private Socket socket; public ClientMessage(Socket socket) { super(); this.socket = socket; } @Override public void run() { try { BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()); byte[] b = new byte[1024*8]; while(true){ int i = bis.read(b); if(i == -1){ break; } String msgFromServer = new String(b,0,i); System.out.println(msgFromServer); } bis.close(); } catch (IOException ex) { ex.printStackTrace(); } } }
public class Server {public static void main(String[] args) throws IOException {ServerSocket s = new ServerSocket(81);// 建立伺服器通訊端,指定連接埠號碼List<Socket> sockets = new ArrayList<Socket>();System.out.println("伺服器啟動了");int i = 0;for (; i <= 100; i++) {// 可以有100個用戶端// accept()是一個阻塞方法,如果用戶端沒有請求到來,該方法就不會執行。請求到達後立即產生一個Socket對象// 偵聽並接收到此通訊端的串連Socket socket = s.accept();// 輸出該通訊端的字串格式System.out.println(socket);sockets.add(socket);// 啟動線程用來接收訊息並且群發new Thread(new ChatMessage(socket, sockets)).start();}}}class ChatMessage implements Runnable {private Socket socket;private List<Socket> sockets;public ChatMessage(Socket socket, List<Socket> sockets) {super();this.socket = socket;this.sockets = sockets;}@Overridepublic void run() {try {// 擷取當前socket的輸入資料流BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());byte[] b = new byte[1024];String msg = "";while (true) {int i = bis.read(b);if (i == -1) {break;}//擷取用戶端的訊息msg = new String(b, 0, i);//群發for (Socket s : sockets) {out(s, socket.getInetAddress().getHostName() + ":" + msg);}}} catch (IOException e) {}}private void out(Socket s, String msg) {try {BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());byte[] b = msg.getBytes();bos.write(b, 0, b.length);bos.flush();} catch (IOException e) {}}}
3、總結
首先建立伺服器對象ServerSocket,並指定連接埠號碼,連接埠不能被佔用。然後調用其accept()方法偵聽並接收到此通訊端的串連。這是伺服器的準備工作。用戶端需要建立通訊端指定ip和連接埠號碼確定對應的伺服器。
基於java的聊天室/群發控制台程式