1. Socket
Socket
主要用来收发服务器数据。
-
主要方法
socket.getInputStream() // 接收服务器输入 socket.getOutputStream() // 发送服务器输出 socket.getInetAddress() // 服务器地址 socket.getPort() // 服务器端口号 socket.getLocalAddress() // 本地地址 socket.getLocalPort() // 本地端口号 socket.shutdownInput() // 半关闭输入 socket.shutdownOutput() // 半关闭输出
-
Socket
的选项TCP_NODELAY
,是否使用Nagle算法。对应方法setTcpNoDelay(boolean)
设置为true
表示立即发送数据包。SO_TIMEOUT
,指定系统等待的时间。对应方法setSoTimeout(int)
设置0
为一直等待,为默认值。SO_LINGER
,指定Socket
关闭后如何处理尚未发送的数据包。对应方法setSoLinger(boolean, int)
设置为true
时,close()
方法会被阻塞指定的秒数,等待发送数据和接受确认。SO_SNDBUF
,设置发送缓存区大小。对应方法setSendBufferSize(int)
。SO_RCVBUF
,设置接收缓存区大小。对应方法setReceiveBufferSize(int)
。SO_KEEPALIVE
,设置是否与服务器保持连接。对应方法setKeepAlive(boolean)
。SO_OOBINLINE
,发送单字节紧急数据。socket.setOOBInline(boolean)
,socket.sendUrgentData(int)
。SO_REUSEADDR
,是否允许重用Socket
所绑定的本地地址。对应方法setReuseAddress(boolean)
。IP_TOS
,设置不同性能要求。对应方法setTrafficClass(int)
。
2. Socket进行TCP通信
-
服务端
int TCP_SERVER_PORT = 1234; // 创建一个ServerSocket对象 ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(TCP_SERVER_PORT); // 监听连接请求 Socket socket = serverSocket.accept(); // 获取输入流 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 获取输出流 BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // 读取接收信息,转换为字符串 String incomingMsg = in.readLine(); System.out.println(incomingMsg); String outgoingMsg = "receive data from port " + TCP_SERVER_PORT + System.getProperty("line.separator"); out.write(outgoingMsg); out.flush(); socket.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { } } }
-
客户端
String serverIp = "127.0.0.1"; int TCP_SERVER_PORT = 1234; try { Socket socket = new Socket(serverIp, TCP_SERVER_PORT); // 获取输入流 BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream())); // 生成输出流 BufferedWriter out = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream())); String outMsg = "Socket TCP connecting to " + TCP_SERVER_PORT + System.getProperty("line.separator"); out.write(outMsg); out.flush(); String inMsg = in.readLine(); System.out.println(inMsg); // 关闭连接 socket.close(); } catch (Exception e) { e.printStackTrace(); }
3. Socket进行UDP通信
-
服务端
int UDP_SERVER_PORT = 1234; int MAX_LEN = 1024; byte[] buffer = new byte[MAX_LEN]; DatagramPacket dp = new DatagramPacket(buffer, MAX_LEN); // 新建一个DatagramSocket类 DatagramSocket ds = null; try { // UDP服务器监听的端口 ds = new DatagramSocket(UDP_SERVER_PORT); // 准备接收数据 ds.receive(dp); System.out.println(new String(dp.getData(), 0, dp.getLength())); } catch (Exception e) { e.printStackTrace(); } finally { if (ds != null) { ds.close(); } }
-
客户端
String serverIp = "127.0.0.1"; int UDP_SERVER_PORT = 1234; byte[] buffer = ("data from UDP client " + UDP_SERVER_PORT).getBytes(); // 新建一个DatagramSocket对象 DatagramSocket ds = null; try { ds = new DatagramSocket(); // 初始化InetAddress对象 InetAddress serverAddr = InetAddress.getByName(serverIp); // 初始化DatagramPacket对象 DatagramPacket dp = new DatagramPacket(buffer, buffer.length, serverAddr, UDP_SERVER_PORT); ds.send(dp); } catch (Exception e) { e.printStackTrace(); } finally { if (ds != null) { ds.close(); } }