需要提前了解知识点
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 实现聊天功能相关推荐

  1. 用socket实现聊天

    socket是什么? 1.socket是协议和你应用程序的一个接口,你通过它来实现通信,是用来做通信的一套API 2.socket就是插座的意思,把2个东西通过电线插在插座上,就可以通信了 3.各种通 ...

  2. 简单java socket_基于Java Socket实现一个简易在线聊天功能(一)

    最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到脚本之家平台,以此做个记录,方便自己和大家使用. 先给大家说下实现步骤分这样几大步: 1.使用 ...

  3. python实现淘宝客服自动回复语_Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例...

    本文实例讲述了Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能.分享给大家供大家参考,具体如下: [吐槽] 网上的代码害死人,看着都写的言之凿凿,可运行就是有问题. 有些 ...

  4. Socket编程一实现简易的聊天功能以及文件传输

    干程序是一件枯燥重复的事,每当感到内心浮躁的时候,我就会找小说来看.我从小就喜爱看武侠小说,一直有着武侠梦.从金庸,古龙,梁羽生系列到凤歌(昆仑),孙晓(英雄志)以及萧鼎的(诛仙)让我领略着不一样的江 ...

  5. Socket通信,实现简单的双人聊天功能

    Socket通信 1.简单介绍 学习Socket也只是通过一个小例子学习的,关于Socket原理目前只是了解到是基于TCP协议,关于TCP与UDP协议区别可以去百度详情查一下他们的区别之处,大体上是传 ...

  6. Netty 4.x Netty 实现聊天功能

    Netty 实现聊天功能 Netty 是一个 Java NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议.Netty 大大简化了网络程序的开发过程比如 TCP ...

  7. Socket.IO聊天室~简单实用

    小编心语:大家过完圣诞准备迎元旦吧~小编在这里预祝大家元旦快乐!!这一次要分享的东西小编也不是很懂啊,总之小编把它拿出来是觉地比较稀奇,而且程序也没有那么难,是一个比较简单的程序,大家可以多多试试~ ...

  8. python实现简易聊天需要登录_python编写简易聊天室实现局域网内聊天功能

    本文实例为大家分享了python实现局域网内聊天功能的具体代码,供大家参考,具体内容如下 功能: 可以向局域网内开启接收信息功能的ip进行发送信息,我们可以写两段端口不同的代码来实现在一台电脑上与自己 ...

  9. 网络编程C/S模型怎样才能实现真正的聊天功能

    学完socket编成后,就迫不及待地写一个简单的聊天程序,好在同学面前装装逼,毕竟外行看热闹.然而在自己的电脑上运行是毫无差错,发送接收都没有问题,然而将客户端的exe文件打包后发送给其他电脑上运行时 ...

最新文章

  1. python怎么读excel文件-Python读写Excel文件方法介绍
  2. 屏蔽机房设计时需要注意什么 ?如何更好维护使用屏蔽机房?
  3. 从URI中获取实际的文件path
  4. QT的QStylePlugin类的使用
  5. AjaxPro对象参数传递
  6. 腾讯物联网操作系统正式开源,最小体积仅1.8 KB
  7. 30岁软件测试转产品_30岁的我脸上竟然出现皱纹了,求推荐抗衰老产品,最好是国外的...
  8. Vue err:This dependency was not found
  9. 第四章 INI配置——《跟我学Shiro》[张开涛]
  10. 手写数字图像识别-SVM算法投票法实现多分类
  11. 大气中水汽凝结物对微波遥感的影响
  12. win10禁用全角_win10输入法全角半角怎么切换 快捷键使用教程
  13. Stanford机器人D-H坐标系
  14. 逆向知识之CS辅助/外挂专题.2.实现CS1.6无限夜视仪.无限闪光烟雾高爆弹.
  15. oracle dbf 超大,system01.dbf文件过大——SYSTEM表空间AUD$使用空间过大问题处理
  16. whm 设置共享IP
  17. 用c语言对图像进行模板匹配,[转载]模板匹配的基本概念
  18. php怎么把字弄到另一张图片上,怎样把一张图片p到另外一张图片上去
  19. java获取dns记录_java-使用JNDI获取DNS SRV记录
  20. 使用爬虫代理时遇到的一些问题

热门文章

  1. 叠加原理 戴维南定理
  2. before和after怎么区分_如何区分before和after~有时候觉得两者可以通用
  3. 今日arXiv精选 | 18篇近期值得关注的Transformer工作
  4. 盘点近期大热对比学习模型:MoCo/SimCLR/BYOL/SimSiam
  5. 首个金融领域的开源中文预训练语言模型FinBERT了解下
  6. linux tcp 包大小,linux – 通过大量连接和小数据包流量高的千兆网络提高TCP性能...
  7. python数据分析考点_零基础30天入门python数据分析|知识点整理
  8. byte数组转字符串_leetcode刷题844比较含退格的字符串(带代码解析,带知识点回顾)...
  9. sqlplus配置连接mysql_如何配置和使用iSQL*Plus
  10. unity随机方向的代码_ECCV 2020 目前用于车辆重识别(vehicle reID)中最大的合成车辆数据集(代码开源)...