Socket通信是一种非常重要的通信方式,它使用起来简单方便,也很容易学会,下面就我所知道的简单记录一下。
首先是UDP的方式。(通过Android与PC端进行通信)
发送端:
- package com.zww.socket;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- public class SocketClient {
- public static void main(String[] args) {
- try {
- // 创建发送方的套接字,IP默认为本地,端口号随机
- DatagramSocket sendSocket = new DatagramSocket();
- // 确定要发送的消息:
- String mes = "你好!接收方!";
- // 由于数据报的数据是以字符数组传的形式存储的,所以传转数据
- byte[] buf = mes.getBytes();
- // 确定发送方的IP地址及端口号,地址为本地机器地址
- int port = 11511;
- InetAddress ip = InetAddress.getLocalHost();
- // 创建发送类型的数据报:
- DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, ip,
- port);
- // 通过套接字发送数据:
- sendSocket.send(sendPacket);
- // 确定接受反馈数据的缓冲存储器,即存储数据的字节数组
- byte[] getBuf = new byte[1024];
- // 创建接受类型的数据报
- DatagramPacket getPacket = new DatagramPacket(getBuf, getBuf.length);
- // 通过套接字接受数据
- sendSocket.receive(getPacket);
- // 解析反馈的消息,并打印
- String backMes = new String(getBuf, 0, getPacket.getLength());
- System.out.println("接受方返回的消息:" + backMes);
- // 关闭套接字
- sendSocket.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- /** * */package com.zww.socket;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- import java.net.SocketAddress;
- /**
- * @zww Administrator
- *
- */
- public class SocketServer {
- public static void main(String[] args){
- DatagramSocket serverSocket = null;
- try {
- //确定接收方IP和端口号
- InetAddress ip = InetAddress.getLocalHost();
- int port = 11511;
- //确定接收方的套接字
- serverSocket = new DatagramSocket(port, ip);
- //创建接收byte[]
- byte[] rebuf = new byte[1024];
- //创建接收类型数据报
- DatagramPacket getPacket = new DatagramPacket(rebuf, rebuf.length);
- //通过套接字接收数据
- serverSocket.receive(getPacket);
- //解析收到的消息
- String getMsg = new String(rebuf,0,getPacket.getLength());
- System.out.println("收到的消息"+getMsg);
- //获取发送方的IP
- InetAddress rmIP = getPacket.getAddress();
- int rmport = getPacket.getPort();
- System.out.println("rmIP:"+rmIP+"rmport:"+rmport);
- //获取发送放套接字地址
- SocketAddress rmSocket = getPacket.getSocketAddress();
- //反馈消息
- String res = new String("yes I Have received");
- byte[] resbyte = res.getBytes();
- //构建发送数据报
- DatagramPacket sendPacket = new DatagramPacket(resbyte, resbyte.length ,rmSocket);
- //通过套接字发送回复
- serverSocket.send(sendPacket);
- serverSocket.close();
- } catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- }
- }
- }
现在介绍TCP的实现过程。
客户端代码:
- // 1.根据指定的server地址和端口,建立socket连接。
- Socket socket = new Socket(server, servPort);
- // 2. 根据socket实例获取InputStream, OutputStream进行数据读写。
- InputStream in = socket.getInputStream();
- OutputStream out = socket.getOutputStream();
- out.write(data);
- //3.操作结束,关闭socket.
- socket.close();
服务端代码:
- //1. 构造ServerSocket实例,指定服务端口。
- ServerSocket servSock = new ServerSocket(servPort);
- while(true)
- {
- // 2.调用accept方法,建立和客户端的连接
- Socket clntSock = servSock.accept();
- SocketAddress clientAddress =
- clntSock.getRemoteSocketAddress();
- System.out.println("Handling client at " + clientAddress);
- // 3. 获取连接的InputStream,OutputStream来进行数据读写
- InputStream in = clntSock.getInputStream();
- OutputStream out = clntSock.getOutputStream();
- while((recvMsgSize = in.read(receiveBuf)) != -1)
- {
- out.write(receiveBuf, 0, recvMsgSize);
- }
- // 4.操作结束,关闭socket.
- clntSock.close();
- }
注意一些常见错误,创建同一个socket只能创建一次,第二次使用时无需再次创建,此外socket.close()方法是不能立即释放掉资源的,如果再很短的时间内再次创建被关闭的socket是会出现错误的。
本文详细介绍了Socket通信的基础知识,包括UDP和TCP两种主要通信方式的实现原理及代码示例。通过具体的客户端和服务端代码,帮助读者理解如何搭建简单的Socket通信系统。
504

被折叠的 条评论
为什么被折叠?



