Socket 实现聊天功能
生活随笔
收集整理的這篇文章主要介紹了
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 实现聊天功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java.net.ServerSocke
- 下一篇: 高亮标红