Java使用TCP实现在线聊天的示例代码
作者:小矮多 发布时间:2021-10-16 23:49:53
标签: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,0,0,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,true,"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,0,TimeUnit.MILLISECONDS,queue);
while(true){
//TCP 要发送消息必须先建立连接
Socket clientSocket=tcpServerSocket.accept();
pool.execute(new TalkRunnable(clientSocket));//有一个客户端连接到服务器,就起一个线程来专门处理这个对话
}
}
}
运行结果:
为什么要使用多线程?
因为单线程会发生阻塞,聊天就进行不下去了。。。
又是自己和自己聊天的一天= =,最近好迷TCP和UDP,欢迎各位大佬批评指正呀,一起交流呀!!! 啦啦啦
对比这个聊天程序和上一篇用UDP写的聊天程序可以更好的体会TCP和UDP的区别。
来源:https://blog.csdn.net/nefss_/article/details/103787335
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- java 高并发中volatile的实现原理摘要: 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Vola
- ReentrantLock锁ReentrantLock是Java中常用的锁,属于乐观锁类型,多线程并 * 况下。能保证共享数据安全性,线程间有
- 本文实例讲述了java采用中文方式显示时间的方法。分享给大家供大家参考。具体如下:其中t为秒,比如有时候需要计算两个任务相差多久,或者该任务
- 在我们的服务中不可避免的需要使用到一些秘钥(数据库、redis等)开发和测试环境还好,但生产如果采用明文配置讲会有安全问题,jasypt是一
- 问题介绍:用二维数组表示一个迷宫,设置迷宫起点和终点,输出迷宫中的一条通路实现思路:二维数组表示迷宫:0表示路且未走过、1表示墙、2表示通路
- 面试题1:说说你对消息队列的理解,消息队列为了解决什么问题?我们公司业务系统一开始体量较小,很多组件都是单机版就足够,后来随着用户量逐渐扩大
- 对其做了些优化,但此种sql生成方式仅适用于复杂程度不高的sql,所以实用性不是很高,仅仅是写着玩的,知道点mybatis的注解形式的使用方
- springboot就是简化Spring应用中的初始化配置,快速创建项目而生的。创建springboot项目代开idea,点击File—&g
- 1.什么是逆向工程mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的
- 今天给大家提供一个由今天给大家提供一个由Java swing实现的酒店管理系统,数据库采用sqlserver,我会贴上部分代码,完整的代码请
- 本文介绍了eclipse下搭建hibernate5.0环境的步骤,分享给大家,具体如下:hibernate引入的jar包:hibernate
- 项目最终的文件结构1 添加maven依赖 <dependency> <groupI
- 简介方案对比本处列举表示类型或状态的常用方法的对比。法1:使用数字表示(不推荐)//1:支付宝支付;2:微信支付;3:银行卡支付privat
- 在java中调用xls格式化xml 使用javax.xml.transform.Transformer,将xml用xls格式化为另一种xml
- 一、前言(吐槽+煽情+简介) &n
- 本文实例为大家分享了java http token的具体代码,供大家参考,具体内容如下package com.monitoring.comm
- 本文实例为大家分享了Unity键盘WASD实现物体移动的具体代码,供大家参考,具体内容如下1首先在场景中建立一个Capsule,将主摄像机拖
- AndroidStduio3.0使用gradle将module打包jar文件,首先需要安装gradle。打开控制台输入  
- SpringMVC常用组件DispatcherServlet:前端控制器,不需要工程师开发,由框架提供作用:统一处理请求和响应,整个流程控制
- 1. 最小生成树连通图中的每一棵生成树 , 都是原图的极大无环子图 , 即: 从中删去任何一条边 , 生成树就不再连通;反之 , 在其中引入