关键词:
文章目录
TCP通信
快速入门(一发一收)
TCP协议回顾:
TCP是一种面向连接,安全、可靠的传输数据的协议
传输前,采用“三次握手”方式,点对点通信,是可靠的
在连接中可进行大数据量的传输
TCP通信模式:
在java中只要是使用java.net.Socket类实现通信,底层即是使用了TCP协议
编写客户端代码
Socket(客户端):
构造器 | 说明 |
---|---|
Socket(String host , int port) | 创建发送端的Socket对象与服务端连接,参数为服务端程序的ip和端口。 |
Socket类成员方法:
方法 | 说明 |
---|---|
OutputStream getOutputStream() | 获得字节输出流对象 |
InputStream getInputStream() | 获得字节输入流对象 |
客户端实现步骤:
- 创建客户端的Socket对象,请求与服务端的连接。
- 使用socket对象调用getOutputStream()方法得到字节输出流。
- 使用字节输出流完成数据的发送。
- 不建议直接关闭socket管道释放资源, 一般用户退出时才会关闭。
/**
客户端
*/
public class ClientDemo
public static void main(String[] args)
try
// 1. 创建socket通信管道请求与服务端进行连接
/**
参数一: 服务器IP地址
参数二: 服务器端口号
*/
Socket socket = new Socket("127.0.0.1", 7777);
// 2. 从socket通信管道中获取到字节输出流
OutputStream os = socket.getOutputStream();
// 包裹低级字节输出流为字节打印流
PrintStream ps = new PrintStream(os);
// 3. 打印流发送消息
ps.println("我是TCP的客户端");
ps.flush(); // 刷新
catch (Exception e)
e.printStackTrace();
编写服务器代码
ServerSocket(服务端):
构造器 | 说明 |
---|---|
ServerSocket(int port) | 注册服务端端口 |
ServerSocket类成员方法:
方法 | 说明 |
---|---|
Socket accept() | 等待接收客户端的Socket通信连接 连接成功返回Socket对象与客户端建立端到端通信 |
服务端实现步骤:
- 创建ServerSocket对象,注册服务端端口。
- 调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象。
- 通过Socket对象调用getInputStream()方法得到字节输入流、完成数据的接收。
- 不建议直接关闭socket管道释放资源, 一般用户退出时才会关闭。
/**
服务器
*/
public class ServerDemo
public static void main(String[] args)
try
// 1. 创建ServerSocket对象注册服务器端口
ServerSocket serverSocket = new ServerSocket(7777);
// 2. 调用accept方法, 等待客户端连接, 连接成功返回socket管道对象
Socket socket = serverSocket.accept();
// 3. 从socket管道中获取字节输入流, 完成数据接受
InputStream is = socket.getInputStream();
// 把字节输入流包装为缓冲字符输入流进行消息接收
BufferedReader br = new BufferedReader(new InputStreamReader(is));
// 按照行读取
String message;
if ((message = br.readLine()) != null)
System.out.println(message);
catch (Exception e)
e.printStackTrace();
多发多收
需求:
- 使用TCP通信方式实现:多发多收消息。
具体要求:
- 可以使用死循环控制服务端收完消息继续等待接收下一个消息。
- 客户端也可以使用死循环等待用户不断输入消息。
- 客户端一旦输入了exit,则关闭客户端程序,并释放资源。
客户端
/**
客户端
*/
public class ClientDemo
public static void main(String[] args)
try
Socket socket = new Socket("127.0.0.1", 7777);
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
// 客户端使用死循环等待用户不断地输入消息
Scanner scanner = new Scanner(System.in);
while (true)
System.out.println("发送消息: ");
String inp = scanner.nextLine();
// 一旦输入了exit,则关闭客户端程序,并释放资源
if (inp.equals("exit"))
System.out.println("下线成功");
ps.close();
break;
ps.println(inp);
ps.flush();
catch (Exception e)
e.printStackTrace();
服务端
/**
服务器
*/
public class ServerDemo
public static void main(String[] args)
try
ServerSocket serverSocket = new ServerSocket(7777);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String message;
// 死循环控制服务端收完消息继续等待接收下一个消息
while ((message = br.readLine()) != null)
System.out.println("收到消息: " + message);
catch (Exception e)
e.printStackTrace();
多发多收(同时接受多个客户端)
思考: 案例实现了多发多收,那么是否可以同时接收多个客户端的消息?
不可以的。
因为服务端现在只有一个线程,只能与一个客户端进行通信; 并且上面代码中, 我们只连接了一个客户端然后就在死循环接受消息。
那么如何才可以让服务端可以处理多个客户端的通信需求?
引入多线程。
同时处理多个客户端消息实现架构如下:
主线程死循环不断地接收socket链接, 每成功链接一个socket, 就交给子线程处理
实现步骤如下:
优化服务器代码即可
创建一个线程类, 用来处理接收消息
public class ServerReaderThread extends Thread
private Socket socket;
public ServerReaderThread(Socket socket)
this.socket = socket;
@Override
public void run()
try
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String message;
// 死循环控制服务端收完消息继续等待接收下一个消息
while ((message = br.readLine()) != null)
System.out.println("收到消息: " + message);
catch (Exception e)
e.printStackTrace();
在服务器主线程中, 每链接到一个socket都要创建一个线程类交给子线程处理
/**
服务器
*/
public class ServerDemo
public static void main(String[] args)
try
ServerSocket serverSocket = new ServerSocket(7777);
// 1. 主线程中定义一个死循环由主线程不断地接收客户端socket管道连接
while (true)
// 2. 每接收到一个socket管道, 都交给一个独立的子线程负责读取消息
Socket socket = serverSocket.accept();
// 交给子线程处理, 并启动子线程
new ServerReaderThread(socket).start();
catch (Exception e)
e.printStackTrace();
线程池优化
目前的通信架构存在什么问题?
客户端与服务端的线程模型是: 1-1的关系, 有多少客户端就会创建多少线程。
客户端并发越多,系统瘫痪的越快。
引入线程池处理多个客户端消息的架构如下:
线程池优化多发多收, 我们只需要优化服务器的代码即可:
创建一个Runnable任务类
public class ServerReaderRunnable implements Runnable
private Socket socket;
public ServerReaderRunnable(Socket socket)
this.socket = socket;
@Override
public void run()
try
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String message;
// 死循环控制服务端收完消息继续等待接收下一个消息
while ((message = br.readLine()) != null)
System.out.println(socket.getRemoteSocketAddress() + "收到消息: " + message);
catch (Exception e)
e.printStackTrace();
优化服务器端代码
/**
服务器
*/
public class ServerDemo
// 使用静态变量记录一个线程池对象
private static ExecutorService pool = new ThreadPoolExecutor(3, 5, 6,
TimeUnit.SECONDS, new ArrayBlockingQueue<>(2), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
public static void main(String[] args)
try
ServerSocket serverSocket = new ServerSocket(7777);
while (true)
Socket socket = serverSocket.accept();
System.out.println(socket.getRemoteSocketAddress() + "上线了");
// 创建Runnable任务交给线程池处理
pool.execute(new ServerReaderRunnable(socket));
catch (Exception e)
e.printStackTrace();
线程池优势是什么?
服务端可以复用线程处理多个客户端,可以避免系统瘫痪。
适合客户端通信时长较短的场景。
计思想, 客户端将消息发送给服务器, 再由服务器进行转发给其他客户端。
java网络多线程专题(代码片段)
文章目录一、网络的相关概念:网络通信ip地址ipv4地址分类域名端口号网络协议TCP和UDP:InetAddress类:相关方法:代码展示:Socket:TCP网络通信编程应用案例(使用字节流)服务端代码客户端代码:TC... 查看详情
网络编程——tcp协议和通信(代码片段)
第1章 TCP通信TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象。区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。而TCP通信是严格区... 查看详情
golanggo语言网络编程tcp实现通信(代码片段)
这里写目录标题TCP客户端(client)TCP服务端(server)TCP客户端(client)packagemainimport( "bufio" "fmt" "net" "os" "strings")/*一个TCP客户端进行TCP 查看详情
网络编程——java(代码片段)
网络编程1、什么是计算机网络2、网络通信的两个要素3、IP地址4、端口Port5、通信协议6、TCP实现聊天7、TCP文件上传实现8、初识Tomcat9、UDP消息发送10、UDP聊天实现11、UDP多线程在线咨询12、URL下载网络资源1、什么是计算机网络什... 查看详情
qt学习_网络编程_tcp通信聊天(代码片段)
网络编程TCP通信1.用到的类QTcpServer公共函数:void close()QString errorString()constbool isListening()constbool listen(constQHostAddress&address=QHostAddress::Any,quint16port=0)QHostAddre 查看详情
181112网络通信tcp(代码片段)
tec客户端的接受代码importsocketdefmain():#1.创建tcp的套接字tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#2.链接服务器#tcp_socket.connect(("192.168.33.11",7890))server_ip=input("请输入要链接的服务器的ip:")server_port= 查看详情
如何使用tcp/ip开发网络程序(代码片段)
...编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的。本文分享自华为云社区《Java利用TCP协议实现客户端与服务器通信【附通信源码】》,作者:灰小猿... 查看详情
java网络编程-第四节:tcp流套接字(serversocket)编程(代码片段)
文章目录一:Java流套接字通信模型二:相关API详解(1)ServerSocket(2)Socket三:TCP通信示例一:客户端发送什么服务端就返回什么(1)代码(2)效果展示(3)分析四: 查看详情
java网络编程-第四节:tcp流套接字(serversocket)编程(代码片段)
文章目录一:Java流套接字通信模型二:相关API详解(1)ServerSocket(2)Socket三:TCP通信示例一:客户端发送什么服务端就返回什么(1)代码(2)效果展示(3)分析四: 查看详情
java使用tcpudp发送信息(代码片段)
Java使用TCPUDP发送信息网络通信的三要素TCP客户端服务端UDP发送端接收端网络通信的三要素IP地址端口号网络通信协议TCP客户端importjava.io.OutputStream;importjava.net.InetAddress;importjava.net.Socket;publicclassTcpClientpublicstaticvoidmain(String[]args)t 查看详情
java---网络编程(代码片段)
文章目录网络编程1.网络编程入门1.1软件结构1.2网络通信协议1.3协议分类1.4网络编程三要素2.TCP通信程序2.1概述2.2Socket类2.3ServerSocket类2.4简单的TCP网络程序3.综合案例3.1文件上传案例网络编程1.网络编程入门1.1软件结构C/S结构:... 查看详情
python网络编程(通过tcp或者udp协议通信)(代码片段)
1、基于tcp协议传送文件: 客户端:importsocketimportosimportjsonimportstructclient=socket.socket()client.connect((‘127.0.0.1‘,8080))#文件大小file_size=os.path.getsize(r‘F:\老男孩Python7期\day32\视频\02TCP发送大文件.mp4‘)#文件名字file 查看详情
大数据必学java基础(八十一):基于tcp的网络编程(代码片段)
文章目录基于TCP的网络编程一、功能分解1:单向通信二、功能分解2:双向通信三、功能分解3:对象流传送四、功能分解4:加入完整的处理异常方式五、功能分解5:多线程接收用户请求基于TCP的网络编程功能... 查看详情
linux网络编程——tcp和udp通信(代码片段)
TCP协议流程图、TCP建立即时聊天TCP即时聊天升级:服务器在客户端断开后不断开,客户端可以多次重连服务器进行即时聊天UDP协议流程图、UDP建立即时连接如果在已经处于ESTABLISHED状态下的socket(一般由端口号和标志符区分)需调... 查看详情
分布式系列二:分布式系统的通信(代码片段)
通信是分布式架构的一个基本问题,通信是基于通信协议,通过网络IO来实现的,基本的通信协议有TCP,HTTP,UDP等,Java的IO分为BIO,NIO,AIO等,java领域有很多支持通信的技术,如RMI,MINA,JMS等.网络协议TCP/IP:五层模型:基于OSI七层模型.包含:应用... 查看详情
java基础——网络编程(代码片段)
文章目录网络编程1.1概述1.2、网络通信的要素1.3、IP1.4、端口1.5、通信协议1.6、TCP模拟通信文件上传1.7、UDP1.8、URL网络编程1.1概述1.2、网络通信的要素如何实现网络通信?1.网络编程中有两个主要的问题如何定位到网络上的一... 查看详情
网络编程tcp(代码片段)
一、TCP协议1.TCP协议的特点1.TCP是面向连接的运输层协议。这就意味着,在使用该协议之前,必须建立TCP连接。在传输数据完毕后,必须释放已经建立的TCP连接。2.每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一... 查看详情
网络传输--tcp(代码片段)
TCP网络编程一、TCP简介二、TCP网络程序--客户端三、TCP网络程序--服务端四、TCP知识总结五、文件下载案例六、3次握手和4次挥手回到顶部 一、TCP简介TCP1.TCP的简介 TCP通信需要通过创建链接,数据传送,终止链接3个步骤 2... 查看详情