本帖最后由 没有退路 于 2019-10-10 12:11 编辑
1Socket简介 Socket原理:
Socket:通常称为套接字,用于描述IP地址和端口,是一个通信连的句柄。在internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应不同的服务。 应用程序网络通信原理:通常通过套接字向网络发出请求或者应答网络请求。Socket和ServerSocket类位于java.net包中。ServerSocket位于服务端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会生成一个Socket实例,操作这个实例,完成所需对话。 网络编程分类: java.net 包中提供了两种常见的网络协议的支持: TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。 UDP:UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。 2TCP通信模型和编程 TCP通信模型(客户端和服务端通信): TCP编程的核心类(ServerSocket和Socket): ServerSocket类: 服务器应用程序通过使用 java.net.ServerSocket 类以获取一个端口,并且侦听客户端请求。常用方法如下: 方法名 | | | | ServerSocket(int port, int backlog, InetAddress address) | 构造函数:使用指定的端口、侦听和要绑定到的本地 IP 地址创建服务器。 | | | | | void setSoTimeout(int timeout) | 通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位 | void bind(SocketAddress host, int backlog) | 将 ServerSocket 绑定到特定地址(IP 地址和端口号) |
Socket类: java.net.Socket 类代表客户端和服务器都用来互相沟通的套接字。常用方法如下: 方法名 | | Socket(String host, int port) | 构造函数:创建一个流套接字并将其连接到指定主机上的指定端口号 | Socket(InetAddress host, int port) | 构造函数:创建一个流套接字并将其连接到指定 IP 地址的指定端口号 | void connect(SocketAddress host, int timeout) | | InetAddress getInetAddress() | | | | | | SocketAddress getRemoteSocketAddress() | 返回此套接字连接的端点的地址,如果未连接则返回 null | InputStream getInputStream() | | OutputStream getOutputStream() | | | |
TCP网络编程模型: TCP编程实例:
服务端代码: package com.example.socket;
import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;
public class TestTcpServer {
public static void main(String[] args) {
try { ServerSocket listen = newServerSocket(3333); Socket server = listen.accept(); InputStream in = server.getInputStream(); OutputStream out = server.getOutputStream();
byte[] content = new byte[30]; in.read(content); System.out.println("服务端收到:" + new String(content));
String sendInfo = "No Problem!"; out.write(sendInfo.getBytes());
out.close(); in.close(); server.close(); listen.close(); } catch (Exception e) { e.printStackTrace(); }
} } 客户端代码:
package com.example.socket;
import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;
public class TestTCPClient {
public static void main(String[] args) { try { Socket client = newSocket("127.0.0.1" , 3333); InputStream in = client.getInputStream(); OutputStream out = client.getOutputStream();
String content = "hello,world!"; out.write(content.getBytes());
byte[] receiveInfo = newbyte[30]; in.read(receiveInfo); System.out.println("客户端收到:" + new String(receiveInfo));
out.close(); in.close(); client.close(); } catch (Exception e) { e.printStackTrace(); }
}
} 3UDP通信模型和编程编程 UDP通信模型(客户端和服务端通信): UDP编程的核心类(DatagramSocket和DatagramPacket): DatagramSocket类: 此类表示用来发送和接收数据报包的套接字。常用方法如下: 方法 | | | 构造函数:构造数据报套接字并将其绑定到本地主机上任何可用端口 | | 构造函数:创建数据报套接字并将其绑定到本地主机上的指定端口。 | DatagramSocket(int port, InetAddress laddr) | 构造函数:创建数据报套接字,将其绑定到指定的本地地址。 | void receive(DatagramPacket p) | | void send(DatagramPacket p) | | | |
DatagramPacket类: 此类表示数据报包。常用方法如下: 方法 | | DatagramPacket (byte[] buf, int length) | 构造函数:构造 DatagramPacket,用来接收长度为 length 的数据包。 | DatagramPacket (byte[] buf, int length, InetAddress address, int port) | 构造函数:构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 | | 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 | | | | | | 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。 |
UDP网络编程模型: UDP编程实例: 服务端代码: package com.example.socket;
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;
public class TestUDPServer { public static void main(String[] args){ try { DatagramSocket server = newDatagramSocket(6666);
byte[] recvBuf = new byte[30]; DatagramPacket recvPacket = newDatagramPacket(recvBuf , recvBuf.length); server.receive(recvPacket); String recvStr = newString(recvPacket.getData() , 0 , recvPacket.getLength()); System.out .println("服务端收到: " + recvStr);
int port = recvPacket.getPort(); InetAddress addr = recvPacket.getAddress(); String sendStr = "UDPsever send content"; byte[] sendBuf; sendBuf = sendStr.getBytes(); DatagramPacket sendPacket = newDatagramPacket(sendBuf , sendBuf.length , addr , port ); server.send(sendPacket);
server.close(); } catch (Exception e) { e.printStackTrace(); } } } 客户端代码: package com.example.socket;
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;
public class TestUDPClient { public static void main(String[] args){ try { DatagramSocket client = newDatagramSocket();
String sendStr = "UDPClient send content"; byte[] sendBuf; sendBuf = sendStr.getBytes(); InetAddress addr = InetAddress.getByName("127.0.0.1"); int port = 6666; DatagramPacket sendPacket = newDatagramPacket(sendBuf ,sendBuf.length , addr , port); client.send(sendPacket);
byte[] recvBuf = new byte[30]; DatagramPacket recvPacket = newDatagramPacket(recvBuf , recvBuf.length); client.receive(recvPacket); String recvStr = newString(recvPacket.getData() , 0 ,recvPacket.getLength()); System.out .println("客户端收到: " + recvStr);
client.close(); } catch (Exception e) { e.printStackTrace(); } } }
|