************************************************************************************************************************
网络通讯基础知识备注:
网络铜须的本质就是两个设备之间的数据交换,通过IP地址或者域名和端口连接到另外一台计算机,然后按照规定的协议(TCP协议、UDP协议)来交换数据;在java语言中,网络通讯的建立连接、发送数据和接收数据已经实现了,装成Socket机制。在实际的编程中,做更多的工作是设计协议,生成数据和解析数据即可。Socket是为网络通讯服务的一种机制,通讯两端都需要有Socket,说白了,两台设备之间的通讯就是两个socket之间的通讯,其中数据是以IO流的方式进行传输。在网络模型中,操作通讯是属于应用层。
************************************************************************************************************************
UDP协议:是面向无连接,将数据封装在包中,通过包的形式进行传输,包的大小限制在64k之内,体积小,由于不需要建立连接,效率高,是不可靠协议,无法控制数据传输状态(丢失)
——UDP服务端代码实现
@Test
public void test(){
DatagramSocket serviceSocket = null; // 连接放外边,最后需要关闭连接
try {
serviceSocket = new DatagramSocket(8888); // 定义一个服务端的端口号
System.out.println("UPD服务端启动...");
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length); // 定义接收数据格式
serviceSocket.receive(packet); // 等待客户端连接,具有阻塞功能
int port = packet.getPort(); // 获取客户端端口号
System.out.println("port--------->" + port);
String message = new String(packet.getData(), 0, packet.getLength()); // 接收数据
System.out.println("message--------->" + message); // 打印数据
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (null != serviceSocket) {
serviceSocket.close(); // 关闭连接,容易遗漏
}
}
}
——UDP客户端代码实现
@Test
public void test(){
DatagramSocket clientSocket = null;
try {
clientSocket = new DatagramSocket(); // 建立连接客户端连接
System.out.println("UPD客户端启动了...");
InetAddress serviceAddress = InetAddress.getByName("192.168.0.101"); // 服务端的IP地址
String message = "hello world"; // 定义具体数据信息
byte[] data = message.getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, serviceAddress, 8888); // 定义发送格式
clientSocket.send(packet); // 发送数据
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (null != clientSocket) {
clientSocket.close(); // 关闭连接,容易遗漏
}
}
}
UPD客户端启动了...
UPD服务端启动...
port--------->51486
message--------->hello world
TCP协议:面向连接,通过上次握手建立连接通道,是可靠协议,数据以字节流形式进行传输,可以发送大量数据,效率相对低
——TCP服务端代码实现
@Test
public void test(){
ServerSocket serviceSocket = null;
InputStream is = null;
OutputStream os = null;
try {
serviceSocket = new ServerSocket(9999); // 定义服务端端口号
System.out.println("TCP服务端启动...");
Socket socket = serviceSocket.accept(); // 等待客户端连接,具有阻塞效果
is = socket.getInputStream(); // 输入流,读取数据
byte[] data = new byte[1024];
int length = is.read(data);
String message = new String(data, 0, length);
System.out.println("message---------->" + message);
os = socket.getOutputStream(); // 输出流,发送数据
String reply = "服务端回复:" + message;
os.write(reply.getBytes());
os.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
// 关闭流
if (null != serviceSocket) {
try {
serviceSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != os) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
——TCP客户端代码实现
@Test
public void test(){
Socket clientSocket = null;
OutputStream os = null;
InputStream is = null;
try {
clientSocket = new Socket("192.168.0.101", 9999); // 连接一个服务端,配置IP地址和端口号,端口号与服务端定义的端口号一致
System.out.println("TCP客户端启动...");
os = clientSocket.getOutputStream(); // 输出流,发送数据
String message = "TCP hello world";
os.write(message.getBytes());
os.flush();
is = clientSocket.getInputStream(); // 输入流,读取数据
byte[] data = new byte[1024];
int length = is.read(data);
String messageReplied = new String(data, 0, length);
System.out.println("messageReplied----->" + messageReplied);
} catch (IOException e) {
e.printStackTrace();
}finally {
if (null != clientSocket) {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != os) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
TCP服务端启动...
message---------->TCP hello world
TCP客户端启动...
messageReplied----->服务端回复:TCP hello world