1. 程式人生 > 程式設計 >Java使用TCP實現線上聊天的示例程式碼

Java使用TCP實現線上聊天的示例程式碼

客戶端的程式碼:

package tcp.http;

import java.io.*;
import java.net.*;
import java.util.Scanner;

public class Client{
public static void main(String[] args) throws IOException{
Scanner scanner=new Scanner(System.in);
//1.建立Socket
Socket tcpClientSocket=new Socket();
//2.TCP要傳送訊息,必須先建立連線
byte[] IPv4={127,1};  //連線到本機
InetAddress serverAddress=InetAddress.getByAddress(IPv4);
SocketAddress serverSocketAddress=new InetSocketAddress(serverAddress,7777);
tcpClientSocket.connect(serverSocketAddress);//連線上了,(連線過程程式碼比較長,但是沒有什麼複雜的,只需要查文件根據函式的構造過程,一步步來寫就好了)

while(true){ //寫個死迴圈來聊天
String request=scanner.nextLine();
//通過位元組流寫入請求
OutputStream os=tcpClientSocket.getOutputStream();
//通過列印流列印和寫入
PrintStream out=new PrintStream(os,true,"UTF-8");
out.println(request);
//通過位元組流讀取響應
InputStream is=tcpClientSocket.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(is,"UTF-8")); //通過readLine()來保證每次都能把一句完整的話讀完(\r\n是標誌);
String response=reader.readLine();
System.out.println("      "+response);
}
//tcpClientSocket.close();
}
}

伺服器端的程式碼:

package tcp.threads;

import java.io.*;
import java.net.*;
import java.util.Scanner;
import java.util.concurrent.*;

public class Server{

private static class TalkRunnable implements Runnable{ //一個個的工作執行緒
private Socket clientSocket;
TalkRunnable(Socket socket){
this.clientSocket=socket;
}
@Override
public void run(){
try{
InetAddress clientAddress=clientSocket.getInetAddress();
int clientPort=clientSocket.getPort();
System.out.printf("ID為 %s:%d 的好友上線了%n",clientAddress.getHostAddress(),clientPort);
//獲取位元組流
InputStream is=null;
is=clientSocket.getInputStream();
//位元組流轉換為字元流
InputStreamReader 
isReader=null;
isReader=new InputStreamReader(is,"UTF-8");
//獲取輸出位元組流
OutputStream os=clientSocket.getOutputStream();
//獲取列印流
PrintStream out=new PrintStream(os,"UTF-8");
//獲取緩衝字元流
BufferedReader reader=new BufferedReader(isReader);
while(true){ //死迴圈聊天
String line=reader.readLine();
System.out.println("      好友說:"+line);
Scanner scanner=new Scanner(System.in);
String response=scanner.nextLine();
out.println(response);
}
}catch(IOException e){
e.printStackTrace();
}
}
}

public static void main(String[] args) throws IOException{
//監聽連線
ServerSocket tcpServerSocket=new ServerSocket(7777);
//定義阻塞佇列
BlockingQueue<Runnable> queue=new LinkedBlockingQueue<>();
//建立執行緒池
ExecutorService pool=new ThreadPoolExecutor(100,100,TimeUnit.MILLISECONDS,queue);

while(true){
//TCP 要傳送訊息必須先建立連線
Socket clientSocket=tcpServerSocket.accept();
pool.execute(new TalkRunnable(clientSocket));//有一個客戶端連線到伺服器,就起一個執行緒來專門處理這個對話
}
}
}

執行結果:

為什麼要使用多執行緒?

因為單執行緒會發生阻塞,聊天就進行不下去了。。。

又是自己和自己聊天的一天= =,最近好迷TCP和UDP,歡迎各位大佬批評指正呀,一起交流呀!!! 啦啦啦

對比這個聊天程式和上一篇用UDP寫的聊天程式可以更好的體會TCP和UDP的區別。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。