日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Socket 实现聊天功能

發布時間:2024/9/30 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Socket 实现聊天功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

需要提前了解知識點
java.net.Socket 解析
java.net.ServerSocket 解析

使用socket實現一個端對端聊天系統。

消息的格式為:消息長度(int)+消息內容

通過消息長度來進行socket分包,防止讀取出現半包、粘包等問題。

服務端代碼

import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;/*** @author jijs* @date 2017-08-14*/ public class ChatServer {public static void main(String[] args) throws Exception {start();}public static void start() throws Exception {try (ServerSocket ss = new ServerSocket(9000);Socket s = ss.accept();InputStream is = s.getInputStream();OutputStream os = s.getOutputStream();) {//開啟一個線程,實時讀取對方發過來的消息new Thread(ChatUtil.receive(is)).start();//從控制臺輸入消息,并發送ChatUtil.send(os);} catch (IOException e) {e.printStackTrace();}}}

客戶端代碼

import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;/*** @author jijs* @date 2017-08-14*/ public class ChatClient {public static void main(String[] args) throws Exception {start();}public static void start() {try (Socket s = new Socket("127.0.0.1", 9000);InputStream is = s.getInputStream();OutputStream os = s.getOutputStream();) {//開啟一個線程,實時讀取對方發過來的消息new Thread(ChatUtil.receive(is)).start();//從控制臺輸入消息,并發送ChatUtil.send(os);} catch (IOException e) {e.printStackTrace();}}}

聊天工具類

import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Scanner;/*** @author jijs* @date 2017-08-14*/ public class ChatUtil {/*** 讀取對方發過來的消息* @param is* @return*/public static Runnable receive(final InputStream is) {return new Runnable() {public void run() {while (true) {try {// 當前消息總字節長度int returnLen = ChatUtil.readLen(is);byte[] b = new byte[returnLen];int readSize = 0; // 每次讀取的字節數int count = 0; // 總讀取的字節數while (count < returnLen && (readSize = is.read(b)) != -1) {count += readSize;}String str = new String(b, 0, readSize);System.out.println("接收:" + str);} catch (IOException e) {e.printStackTrace();break;}}}};}/*** 從控制臺接收用戶輸入,發送消息給對方* @param os*/public static void send(final OutputStream os) {Scanner scan = new Scanner(System.in);while (true) {try {String s = scan.nextLine();byte[] data = s.getBytes();int len = data.length;os.write(ChatUtil.int2byte(len));os.write(data);os.flush();} catch (IOException e) {e.printStackTrace();break;}}scan.close();}/*** 讀取消息長度* 消息格式為:消息長度+消息內容* @param is* @return* @throws IOException*/public static int readLen(InputStream is) throws IOException {int b1 = is.read();int b2 = is.read();int b3 = is.read();int b4 = is.read();int len = (b1 << 24) + (b2 << 16) + (b3 << 8) + b4;return len;}/*** int 轉 byte[] 數組* @param len* @return*/public static byte[] int2byte(int len) {byte[] b = new byte[4];b[0] = (byte) (len >> 24);b[1] = (byte) (len >> 16 & 0XFF);b[2] = (byte) (len >> 8 & 0XFF);b[3] = (byte) (len & 0XFF);return b;} }

客戶端控制臺:

服務端控制臺:

本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書

GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT

總結

以上是生活随笔為你收集整理的Socket 实现聊天功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。