基于TCP/UDP的Socket编程
一. 基于UDP协议的Socket通信
1. UDP传送的发送端
<span style="font-size:18px;">package com.markliu.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 创建UDP传输的发送端。
* @author MarkLiu
*/
public class UDPSend {
/*
* 创建UDP传输的发送端。
* 思路:
* 1,建立udp的socket服务。
* 2,将要发送的数据封装到数据包中。
* 3,通过udp的socket服务将数据包发送出去。
* 4,关闭socket服务。
*/
public static void main(String[] args) throws IOException {
System.out.println("UDP发送端启动...");
//1,建立udp的socket服务。使用DatagramSocket对象。
DatagramSocket datagramSocket = new DatagramSocket(20100); // 指定该发送端的端口号
//2,将要发送的数据封装到数据包中。
String data = "UDP开始发送数据,哥们来啦。。。";
byte[] dataByte = data.getBytes();
// 使用DatagramPacket将数据封装到的该对象包中。
// 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
DatagramPacket datagramPacket = new DatagramPacket(dataByte, dataByte.length,
InetAddress.getByName("10.136.13.203"), 20000); // 接收端的ip和端口号
//3,通过udp的socket服务将数据包发送出去。使用send方法。
datagramSocket.send(datagramPacket);
//4,关闭资源。
datagramSocket.close();
}
}</span>
2. UDP传送的接收端
<span style="font-size:18px;">package com.markliu.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 创建UDP传输的接收端。
* @author MarkLiu
*/
public class UDPReceiveDemo {
/*
* 建立UDP接收端的思路。
* 1,建立udp socket服务,因为是要接收数据,必须要明确一个端口号。
* 2,创建数据包,用于存储接收到的数据。方便用数据包对象的方法解析这些数据.
* 3,使用socket服务的receive方法将接收的数据存储到数据包中。
* 4,通过数据包的方法解析数据包中的数据。
* 5,关闭资源
*/
public static void main(String[] args) throws IOException {
System.out.println("UDP接收端启动...");
// 1,建立udp socket服务。
DatagramSocket datagramSocket = new DatagramSocket(20000); // 指定接收端的端口号
// 2,创建数据包。
while (true) { // 此处循环,模拟服务器
byte[] buf = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
// 3,使用接收方法将数据存储到数据包中。
datagramSocket.receive(datagramPacket); // 阻塞式
// 4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。
InetAddress address = datagramPacket.getAddress(); // 返回某台机器的 IP地址对象
String ip = address.getHostAddress();
int port = datagramPacket.getPort();
// 取出数据并转换为字符串
String receiveData = new String(datagramPacket.getData(), 0,
datagramPacket.getLength());
System.out.println("IP:" + ip + "\n端口号Port:" + port
+ "\n接收到的数据receiveData:" + receiveData);
}
// 5,关闭资源
// datagramSocket.close();
}
}
</span>
二. 基于TCP协议的Socket通信
1.客户端程序
package com.markliu.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
* @author MarkLiu
*/
public class TCP_ClientDemo {
public static void main(String[] args) throws UnknownHostException, IOException {
/*
* 客户端发数据到服务端
*
* Tcp传输,客户端建立的过程。
* 1,创建tcp客户端socket服务。使用的是Socket对象,建议该对象一创建就明确目的地。明确要连接的主机。
* 2,如果连接建立成功,说明数据传输通道已建立。 该通道就是socket流 ,是底层建立好的。
* 既然是流,说明这里既有输入,又有输出。 想要输入或者输出流对象,可以找Socket来获取。
* 可以通过getOutputStream(),和getInputStream()来获取两个字节流。
* 3,使用输出流,将数据写出。
* 4,关闭资源。
*/
//创建客户端socket服务。
Socket clientSocket = new Socket( "10.136.13.203",10001); // 创建一个流套接字并将其
// 连接到指定 IP 地址的指定端口号。
//获取socket流中的输出流。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
OutputStream out = clientSocket.getOutputStream();
String text = null;
while((text = bufr.readLine()) != null ){
//使用输出流将指定的数据写出去。
out.write(text.getBytes());
}
// 关闭资源
clientSocket.close();
}
}
2.服务端程序
package com.markliu.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCP_ServerDemo {
public static void main(String[] args) throws IOException {
/* 服务端接收客户端发送过来的数据,并打印在控制台上。
*
* 建立tcp服务端的思路:
* 1,创建服务端socket服务。通过ServerSocket对象。
* 2,服务端必须对外提供一个端口,否则客户端无法连接。
* 3,获取连接过来的客户端对象。
* 4,通过客户端对象获取socket流读取客户端发来的数据 并打印在控制台上。
* 5,关闭资源。关客户端,关服务端。
*/
ServerSocket serverSocket = new ServerSocket(10001);
Socket clientScSocket = serverSocket.accept();
String ip = clientScSocket.getInetAddress().getHostAddress();
InputStream in = clientScSocket.getInputStream();
byte[] buf = new byte[1024];
while(true){
int len = in.read(buf);
String text = new String(buf, 0, len);
System.out.println(ip + ":" + text);
if (text.equals("886")) { // 模拟退出效果
System.out.println("退出聊天窗口");
clientScSocket.close();
serverSocket.close();
}
}
}
}