Socket
Socket是网络编程提供的一种机制,通信的两端都要有socket,网络通信其实就是socket间的通信,数据在两个socket的IO流上通信
开发步骤
创建UDP服务端
- UPPServer
public class UDPServer {
public static void main(String[] args) {
DatagramSocket ds=null;
try {
//创建UDP的服务端的套接字对象
ds= new DatagramSocket(10000);
System.out.println("服务器已经启动");
while (true) {
//定义接收数据报对象
byte[] bytes=new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);
//ds接收数据包
ds.receive(datagramPacket);
//获得数据报中的数据
byte[] data = datagramPacket.getData();
//获得接收的数据长度(实际接收数据的长度)
int length = datagramPacket.getLength();
String result = new String(data, 0, length);
//获得发送端的ip
InetAddress inetAddress = datagramPacket.getAddress();
String hostAddress = inetAddress.getHostAddress();
if ("exit".equals(result)) {
break;
}
System.out.println(hostAddress + "发送了:" + result);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ds != null) {
ds.close();
}
}
}
}
创建UDP客户端
- UDPClient
public class UDPClient {
public static void main(String[] args) throws IOException {
//创建客户端的套接字对象
DatagramSocket ds=null;
BufferedReader br=null;
try {
ds = new DatagramSocket();
br=new BufferedReader(new InputStreamReader(System.in));
while (true) {
String line = br.readLine();
//定义要发送的数据
byte[] bytes = line.getBytes();
//创建要发送的目的地的IP地址对象
InetAddress address = InetAddress.getByName("192.168.31.217");
//封装要发送的数据包
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, 10000);
if ("exit".equals(line)) {
break;
}
//发送数据包
ds.send(datagramPacket);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (ds != null) {
ds.close();
}
if (br != null) {
br.close();
}
}
}
}
UDP简易聊天室
使用了线程,服务器端是一个线程,客户端是一个线程,那么要把两个线程集中到一个聊天室中
- UDPServer
public class UDPServer implements Runnable{
//指定服务端的端口号
private Integer port;
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public UDPServer(Integer port) {
this.port = port;
}
public void run() {
DatagramSocket ds=null;
try {
ds=new DatagramSocket(port);
System.out.println("服务已经启动....");
while (true) {
byte[] bytes=new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);
ds.receive(datagramPacket);
byte[] data = datagramPacket.getData();
String result = new String(data, 0, datagramPacket.getLength());
InetAddress inetAddress = datagramPacket.getAddress();
if ("exit".equals(result)) {
break;
}
System.out.println(inetAddress.getHostAddress() + "说:\r\n" + result);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (ds != null) {
ds.close();
}
}
}
}
- UDPClient
public class UDPClient implements Runnable{
//发送目的IP
private String ip;
private Integer port;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public UDPClient(String ip, Integer port) {
this.ip = ip;
this.port = port;
}
public void run() {
DatagramSocket ds=null;
BufferedReader br=null;
try {
ds=new DatagramSocket();
br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("已经接入" + ip);
while (true) {
byte[] bytes = br.readLine().getBytes();
InetAddress inetAddress = InetAddress.getByName(ip);
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,inetAddress,port);
if ("exit".equals(br.readLine())) {
break;
}
ds.send(datagramPacket);
System.out.println("我说: \r\n" + br.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (ds != null) {
ds.close();
}
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
- ChatRoom
public class ChatRoom {
public static void main(String[] args) {
UDPClient udpClient = new UDPClient("192.168.31.217",10001);
UDPServer udpServer = new UDPServer(10000);
//客户端线程
Thread thread = new Thread(udpClient);
//发送端线程
Thread thread1 = new Thread(udpServer);
//启动两个线程
thread.start();
thread1.start();
}
}
如果要让两个人一起聊天则把上述代码完整拷贝一份,改IP然后一起启动,两个聊天室就可以聊天了