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(); }