1. 程式人生 > >JAVA網路程式設計實戰應用——雙向聊天(執行緒)

JAVA網路程式設計實戰應用——雙向聊天(執行緒)

控制檯雙向聊天

Code

以下如果有些流不懂的話,看我之前關於IO流的文章
要先啟動服務端(Server),再啟動客戶端(Client)
必須要保證埠一致
Socket socket = new Socket(“localhost”,9999);
主機我寫的是localhost,也就是本機

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;
//客戶端 public class Client { // static Socket socket = null; public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("localhost",9999); //讀取服務端傳送過來的資料 new ClientReadThread(socket.getInputStream()).start(); //傳送給服務端資料 InputStream in = System.in;
new ClientWriteThread(in, socket).start(); //以下我也寫了一個執行緒,所以註釋了 /*int len; byte[] byt = new byte[1024]; while ((len = in.read(byt)) != -1) { //傳送資料 new PrintStream(socket.getOutputStream()).println(new String(byt, 0, len)); }*/ } } import java.io.BufferedReader; import java.io.IOException;
import java.io.InputStream; import java.io.InputStreamReader; //讀的執行緒 public class ClientReadThread extends Thread{ private InputStream inputStream; public ClientReadThread(InputStream inputStream) { this.inputStream = inputStream; } @Override public void run() { //讀取資料 服務端傳送過來的資料 while (true) { //使用緩衝流進行讀取 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); try { //讀一行 String readLine = bufferedReader.readLine(); System.out.println("客戶端收到訊息:" + readLine); } catch (IOException e) { e.printStackTrace(); } } } } import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.net.Socket; //客戶端傳送資料的執行緒 public class ClientWriteThread extends Thread{ private InputStream inputStream; private Socket socket; public ClientWriteThread(InputStream inputStream, Socket socket) { this.inputStream = inputStream; this.socket = socket; } @Override public void run() { OutputStream os = null; PrintStream printStream = null; try { os = socket.getOutputStream(); printStream = new PrintStream(os); } catch (IOException e1) { e1.printStackTrace(); } int len; byte[] byt = new byte[1024]; try { while ((len = inputStream.read(byt)) != -1) { //傳送資料 printStream.println(new String(byt, 0, len)); } } catch (IOException e) { e.printStackTrace(); }finally{ if (printStream != null) printStream.close(); try { if (os != null) os.close(); } catch (IOException e) { e.printStackTrace(); } } } } //服務端 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class Server { static ServerSocket serverSocket = null; static Socket accept = null; public static void main(String[] args) throws IOException { serverSocket = new ServerSocket(9999); //建立連線 accept = serverSocket.accept(); //讀取客戶端傳送過來的資料 new ServerReadThread(accept.getInputStream()).start(); //傳送資料 OutputStream outputStream = accept.getOutputStream(); PrintStream printStream = new PrintStream(outputStream); InputStream in = System.in; int len; byte[] byt = new byte[1024]; while ((len = in.read(byt)) != -1) { //傳送資料 printStream.println(new String(byt, 0, len)); } } } //服務端接收資料的執行緒 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class ServerReadThread extends Thread { private InputStream inputStream; public ServerReadThread(InputStream inputStream) { this.inputStream = inputStream; } @Override public void run() { while (true) { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); try { String readLine = bufferedReader.readLine(); System.out.println("伺服器收到訊息:" + readLine); } catch (IOException e) { e.printStackTrace(); } } } }