java实现TCP通信

1.概述

通过ServerSocket与Socket实现的TCP的通信,这个例子配合了swing使用,其实作者之前发过一篇ServerSocker与Socket的通信,在这里,这边文章就是在这个例子上修改而成的.

其实原理很简单的,就是一个服务端一个客户端,服务端这边创建好ServerSocket后,使用accept()堵塞一直等待客户端发送socket.

好吧,不废话了.进正题.

2.服务端

swing的部分就不说了,说一下主要操作.

(1)新建ServerSocket

1ServerSocket serverSocket = null; 2serverSocket = new ServerSocket(12345);//一个不被占用的端口即可

构造方法的参数是端口,默认使用本地ip. ServerSocket有三个构造方法.

1ServerSocket(int port); 2ServerSocket(int port,int backlog); 3ServerSocker(int poer,int backlog,InetAddress ip);

详情可以看这里

(2)接收socket

Socket socket = serverSocket.accept();

返回一个Socket(),会一直等待,处于阻塞状态. 一般设置一个while(true)循环接收.

(3)数据处理

使用DataInputStream与DataOutputStream:

1DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 2DataOutputStram outputStream = new DataOutputStream(socket.getOutputStream());

然后使用read与write方法即可. 注意关闭的时候要等输入输出完成后再一起关闭,就是说,不能这样:

1DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 2String data = inputStream.readUTF(); 3inputStream.close(); 4DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 5outputStream.writeUTF("ok"); 6outputStream.close();

这样的话getInputStream()没有问题,但是到了getOutputStream()的时候就有问题了,会提示异常: 在这里插入图片描述 Socket is closed. 所以解决办法就是等输出完之后再一起关闭:

1DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 2String data = inputStream.readUTF(); 3DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 4outputStream.writeUTF("ok"); 5inputStream.close();//等输出完成后再关闭 6outputStream.close();

(4)完整代码Server.java

1import java.io.DataInputStream; 2import java.io.DataOutputStream; 3import java.io.IOException; 4import java.net.InetAddress; 5import java.net.ServerSocket; 6import java.net.Socket; 7import javax.swing.*; 8 9public class Server { 10 public static void main(String[] args) 11 { 12 JFrame frame = new JFrame("Server"); 13 JPanel panel = new JPanel(); 14 JTextArea text = new JTextArea(); 15 16 panel.add(text); 17 frame.setContentPane(panel); 18 frame.setSize(600, 300); 19 frame.setLocationRelativeTo(null); 20 frame.setVisible(true); 21 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 22 23 ServerSocket serverSocket = null; 24 try 25 { 26 serverSocket = new ServerSocket(12345); 27 while (true) 28 { 29 Socket socket = serverSocket.accept(); 30 DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 31 text.setText(inputStream.readUTF()); 32 33 DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 34 outputStream.writeUTF("ok"); 35 inputStream.close(); 36 outputStream.close(); 37 socket.close(); 38 } 39 } 40 catch (IOException e) 41 { 42 e.printStackTrace(); 43 } 44 finally 45 { 46 try 47 { 48 serverSocket.close(); 49 } 50 catch (IOException e) 51 { 52 e.printStackTrace(); 53 } 54 } 55 } 56}

3.客户端

客户端的操作就是开启一个Socket,再通过这个socket获取对应的输入输出流就可以了.

(1)新建一个Socket

Socket socket = new Socket("127.0.0.1",12345);//这个端口与服务端的端口对应

Socket有三个构造方法:

1Socket(InetAddress ip,int port); 2Socket(String ip,int port); 3Socket(InetAddress ip,int port,InetAddress localIp,int localPort); 4Socket(String ip,int port,InetAddress localIp,int localPort);

详情可以看这里

(2)输入输出

同样使用DataInputStream与DataOutputStream:

1DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 2DataInputStream inputStream = new DataInputStream(socket.getInputStream());

(3)完整代码Client.java

1import java.io.DataInputStream; 2import java.io.DataOutputStream; 3import java.io.IOException; 4import java.net.Socket; 5 6import javax.swing.*; 7import java.awt.GridLayout; 8public class Client 9{ 10 public static void main(String[] args) { 11 JFrame frame = new JFrame(); 12 JTextArea text = new JTextArea(); 13 JButton send = new JButton(); 14 GridLayout layout = new GridLayout(2, 1, 0, 5); 15 16 frame.setTitle("Client"); 17 frame.setVisible(true); 18 frame.setLocationRelativeTo(null); 19 frame.setSize(600, 300); 20 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 21 frame.setLayout(layout); 22 23 frame.add(text); 24 frame.add(send); 25 send.setText("send"); 26 send.addActionListener(v -> 27 { 28 try 29 { 30 String host = "127.0.0.1"; 31 int port = 12345; 32 Socket socket = new Socket(host, port); 33 DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 34 outputStream.writeUTF(text.getText()); 35 36 DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 37 text.setText(inputStream.readUTF()); 38 outputStream.close(); 39 inputStream.close(); 40 socket.close(); 41 } 42 catch (IOException e) 43 { 44 e.printStackTrace(); 45 } 46 }); 47 } 48}

4.测试

先开启服务端,再开启客户端,这里设置了服务端返回给客户端的信息为"ok". 在这里插入图片描述

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593

java实现TCP通信 - HelloWorld