ad

《JAVA服务端研发知识图谱》_让你更懂Java后台研发_1.9.5 网络I/O

admin 145 2023-10-25

【摘要】 本书摘自《JAVA服务端研发知识图谱》一书中第1章,第9节,由何为、迟文恒 编著。

1.9.5 网络I/O

Java 服务之间可以通过网络进行通信,从而可以实现程序间数据的互通,网络 I/O 是 Java 服务进行微服务化的基础。网络通信一般较为复杂,但本书所涉及的内容一般不用考虑过多的 网络部分,网络问题一般都由使用的服务框架解决。所以这里仅作为演示,了解 Java 基本的通 信方式。在下面的例子中,用 Socket 套接字使用 TCP 协议进行通信,创建两个 Java 程序,分 别是客户端程序和服务端程序。

(1)服务端程序

public class NetIOServer extends Thread{

private ServerSocket serverSocket;

public NetlOServer(int port) throws Exception{

《JAVA服务端研发知识图谱》_让你更懂Java后台研发_1.9.5 网络I/O

serverSocket = new ServerSocket(port);

//serverSocket.setSoTimeout(20000);

@Override

public void run(){

while (true){

try {

Socket socket = serverSocket.accept();

socketDialogue(socket);

}catch (Exception e){

e.printStackTrace();

break;

public void socketDialogue(Socket socket){

Thread thread =new Thread({

int count=0;

@Override

public void run(){

try {

while(socket.isConnected(){

DataInputStream inputStream=

new DatalnputStream(socket.getInputStream()); System.out.println("socket server receive:"+inputStream.readUTFO); Thread.sleep(5000);

DataOutputStream outputStream=

new DataOutputStream(socket.getOutputStream()); outputStream.writeUTF("server say nihao"+ count++);

socket.close();

}catch(Exception e){

e.printStackTrace();

};

thread.start(

public static void main(String[] args){

try{

NetlOServer server =new NetIOServer(18088);

server.start();

}catch(Exception e){

e.printStackTrace(

在这段代码中,提前使用了线程,线程的使用在1.10节中讲解。在main 方法中创建了一个 Server监听线程,通过 ServerSocket 监听某端口号,当有链接请求时通过 accept 方法返回和客户 端的连接。通过 Socket 得到客户端传过来的数据,并且延迟5s 回复客户端一条数据。这个逻辑 是写在无限循环中的,会一直监听连接的数据情况并且回复。

(2)客户端程序

public class NetIOClient {

public static void main(String[] args){

int count=0;

try {

Socket socket =new Socket("127.0.0. 1",18088);

DataOutputStream outputStream=

new DataOutputStream(socket.getOutputStream(); outputStream.writeUTF("client say nihao");

while (socket.isConnected()){

DataInputStream inputStream=

new DataInputStream(socket.getInputStream()); System.out.printin("socket client receive:"+ inputStream.readUTFO); Thread.sleep(5000);

outputStream.writeUTF("client say nihao"+ count++);

socket.close();

} catch (Exception e){

e.printStackTrace();

客户端的逻辑是请求与服务端的连接,连接成功后向服务端发送一条数据;发送完第一条 数据后,会一直监听服务器的应答,并且延迟5s 回复给服务端。所以在这个例子中,客户端和 服务端之间会一直通信下去,直到手动结束它们。它们的输出情况为:

服务端输出:

socket server receive: client say nihao

socket server receive: client say nihao0

socket server receive: client say nihaol

socket server receive: client say nihao2

客户端输出:

socket client receive: server say nihao0

socket client receive: server say nihaol

socket client receive: server say nihao2

socket client receive: server say nihao3

以上仅演示了基本的服务间通信,具体项目中的通信情况会更加复杂,好在使用框架可以 解决大部分网络问题,让研发人员能够专心完成业务逻辑。如果读者对网络通信很感兴趣,可 以研究网络通信的 NIO 框 架Netty, 相信会有不少收获。

1.10 并发

一 个 Java 程序运行在一个进程⊙中,但是如上面例子所演示,有时希望一个程序可以同时 做好多事情,例如监听端口、接收数据、逻辑计算等等,那么只有一个运算单元就明显不够 了,所以这时需要启动好多个运算单元,这就是多线程。多个线程的执行其实是抢占 CPU 的时 间,但是在感觉上好像在同时进行一样。本节介绍多线程的写法和一些重点。多线程其实是一 个比较困难的知识点,尤其对于初次接触的新人来讲有些时候较为费解,对于多线程的学习一 定要在实际问题中多多摸索才能真正理解。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《JAVA服务端研发知识图谱》_让你更懂Java后台研发_1.11.1 反射
下一篇:看《Excel人力资源管理实操全流程演练》如何教你做更好的表格_1.3 高效录入数据的技巧
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×