版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chennai1101/article/details/84783794
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_RCV_BUF,设置接收缓存区大小。对应方法
setReceiveBufferSize(int)
。 - SO_KEEPALIVE,设置是否与服务器保持连接。对应方法
setKeepAlive(boolean)
。 - OOBINLINE,发送单字节紧急数据。socket.setOOBInline(boolean),socket.sendUrgentData(int)。
- SO_REUSEADDR,是否允许重用Socket所绑定的本地地址。对应方法
setReuseAddress(boolean)
。 - IP_TOS,设置不同性能要求。对应方法
setTrafficClass(int)
。
- TCP_NODELAY,是否使用Nagle算法。对应方法
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(); } }