说到socket通信,我相信大家多多少少会有些了解。我在这里说说tcp、udp通信
一、tcp通信
1、tcp协议使面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式创建连接,形成传输数据的通道,在连接中进行大量数据的传输,效率稍低
2、Java中基于tcp协议实现网络通信的客户端Socket类,服务端用ServerSocket
通信图
客户端通信步骤
1、创建Socket:里面填写服务端ip和通信端口号
Socket socket = new Socket("127.0.0.1",10088);
2、通过输出流向服务端发送消息
PrintWriter pw = new PrintWriter(socket.getOutputStream())
3、通过输入流读取服务端返回的消息
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str1;
while((str1 = br.readLine()) != null){
System.out.println("服务端返回的确认信息:"+str1);
}
4、关闭输入输出流、关闭socket
pw.flush();
pw.close();
socket.close();
服务端步骤
1、创建serverSocket和Scoket对象,绑定监听端口
Scoket socket;
ServerSocket ss = new ServerSocket(10088);
2、通过accept()方法监听客户端请求
socket = ss.accept();
3、连接建立后,通过输入流读取客户端发送的请求信息
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str;
while ((str = br.readLine()) != null) {
System.out.println("str:"+str);
}
4、通过输出流箱客户端发送相应信息
if(!str.equals("")&&str!=null){
//有消息时输出流开始写,并给客户端发送
PrintWriter pw = new PrintWriter( socket.getOutputStream());
pw.println("ok"+str);
}
5、关闭相关资源
pw.flush();
pw.close();
socket.close();
ss .close();
当需要双方多次通信时先不关闭socket和ss等收到双方断开的消息时关闭socket与ss
二、udp通信
udp通信协议是无连接的、不可靠的、无序的、速度快,由于udp不需要客户端回复,就会出现丢包的情况
进行数据传输时,首先将要传输的数据定义成数据报,在数据报中指明数据要达到的socket(主机地址和端口号),然后再将数据报文发送出去
DatagramPacket表示数据报类
DatagramSocket表示端到端通信的类
客户端实现步骤
1、定义发送到的服务器的地址、端口号、数据信息
InetAddress address =InetAddress.getByName("localhost");
int port =10010;
byte[] data ="我来发送信息了".getBytes();
2、创建DatagramPacket,包含将要发送的信息
DatagramPacket packet = newDatagramPacket(data,data,length,address,port);
3、创建DatagramSocket
DatagramSocket socket =newDatagramSocket();
4、发送数据
socket.send(packet);
若客户端要接收服务端的消息,则进行以下步骤
5、创建数据报,用于接收服务器端的响应数据
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2,data2.length);
6、接收服务器响应的数据并输出
socket.receive(packet2);
String raply = new String(data2,0,packet2.getLenth());
System.out.println("我是客户端,服务器说:"+reply);
7、关闭资源
socket.close();
服务端步骤
1、创建服务器端DatagramSocket,并且指定端口号
DatagramSocket getSocket = new DatagramSocket(10088);
2、创建DatagramPacket用于接收客户端发送数据的数据报
byte[] buf = new byte[36];
DatagramPacket getPacket = new DatagramPacket(buf, buf.length);
3、接收客户端发送的数据并读取
socket.receive(packet);
String info =newString(data,o,data.length);
System.out.println("我是服务器,客户端告诉我"+info);
若需要收到客户端信息后给客户端进行回复,则进行以下步骤
4、定义客户端的地址、端口号、数据
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "欢迎您!".geyBytes();
5、创建数据报,包含回复的数据信息
DatagramPacket packet2 = new DatagramPacket(data2,data2.length,address,port);
6、回复客户端
socket.send(packet2);
7、关闭资源
socket.close();
小M微信二维码 : 有问题可以加微信
打赏二维码:觉得有用有帮助的可以给小M~打赏哦