编写两个新的VC程序,完成以下功能:
一个程序为服务端,建立UDP服务端套接字。
另外一个程序为客户端,建立UDP客户端套接字。
这两个新程序可以互联,完成一个基于TCP/IP网络的文本聊天程序。
因为TCP需要三次握手,所以只能一来一回的实现聊天程序,而UDP可以只负责发送不管对方有没有接到,可以实现更符合现实中的聊天模式,即可以一端发送多条信息。
文件存放格式:
Send_Thread.java
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Scanner;
public class Send_Thread extends Thread{
//发送的socket端
private DatagramSocket sender = null;
//待发送的目标地址,InetSocketAddress用来储存IP套接字地址
private InetSocketAddress address = null;
//接收键盘输入
Scanner scan = new Scanner(System.in);
//构造函数
public Send_Thread(DatagramSocket sender, InetSocketAddress address) {
this.sender = sender;
this.address = address;
}
public void run() {
try {
while (true) {
//输入待发送的内容
String input = scan.nextLine();
if (input.equals("quit"))
break;
byte[] data = null;
data = input.getBytes("UTF-8");
//创建UDP数据报
DatagramPacket pack = new DatagramPacket(data, data.length, address);
sender.send(pack);
}
System.out.println("聊天结束");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Receive_Thread.java
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Receive_Thread extends Thread{
private static final int MAX_RECEIVE_BUFFER = 1024; //最大接收缓存
private DatagramSocket server; //DatagramSocket类用来建立服务器和客户端
private DatagramPacket packet; //DatagramPacket类用来存入和解包UDP数据
byte[] buffer = new byte[MAX_RECEIVE_BUFFER];
//构造函数
public Receive_Thread(DatagramSocket server) {
this.server = server;
packet = new DatagramPacket(buffer, buffer.length);
}
public void run() {
try {
String s = null;
while (true) {
//接收数据包
server.receive(packet);
s = new String(packet.getData(), packet.getOffset(), packet.getLength(), "UTF-8");
//将接收的数据打印到控制台
System.out.println(packet.getAddress() + "/" + packet.getPort() + ":" + s);
packet.setLength(buffer.length);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Create.java
package UDP;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class Create { //创建
private int DEST_PORT = 0;
private int SEND_PORT = 0;
private int RECE_PORT = 0;
private String IP = null;
//构造函数储存IP和端口
public Create(int DEST_PORT, int SEND_PORT, int RECE_PORT, String IP) {
this.DEST_PORT = DEST_PORT;
this.SEND_PORT = SEND_PORT;
this.RECE_PORT = RECE_PORT;
this.IP = IP;
}
public void run(){
try {
System.out.println("输入quit以结束聊天");
Send_Thread send_thread = null;
Receive_Thread receive_thread = null;
InetSocketAddress address = null;
//创建待接受数据包的目的机的端口号和IP地址
address = new InetSocketAddress(IP, DEST_PORT);
//创建发送的Socket端
DatagramSocket sendsocket = new DatagramSocket(SEND_PORT);
//创建接受的Socket端
DatagramSocket recesocket = new DatagramSocket(RECE_PORT);
//发送线程建立
send_thread = new Send_Thread(sendsocket, address);
//接受线程的建立
receive_thread = new Receive_Thread(recesocket);
send_thread.start(); //开启线程
receive_thread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Client.java
package UDP;
public class Client {
private static final int DEST_PORT = 8888;
private static final int SEND_PORT = 10000;
private static final int RECE_PORT = 6666;
private static final String IP = "127.0.0.1";
public static void main(String[] args) {
Create client = new Create(DEST_PORT,SEND_PORT,RECE_PORT,IP);
client.run();
}
}
Server.java
package UDP;
public class Server {
private static final int DEST_PORT = 6666;
private static final int SEND_PORT = 10001;
private static final int RECE_PORT = 8888;
private static final String IP = "127.0.0.1";
public static void main(String[] args) {
Create client = new Create(DEST_PORT,SEND_PORT,RECE_PORT,IP);
client.run();
}
}
结果: