eclipse已测试运行成功
实现聊天窗口界面
package wlbc;
import java.net.*;
import java.util.Scanner;
public class Ch01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("请输入连天服务器当前启动端口号:");
int serverport = sc.nextInt();
System.out.println("请输入聊天服务发送信息对象的目标端口号:");
int targetport = sc.nextInt();
System.out.println("聊天系统初始化完成并启动!");
try {
//创建聊天程序收发平台 DatagramSocket对象
DatagramSocket Socket = new DatagramSocket(serverport);
//分别启动信息接收端和发送端程序
new Thread(new ChatReceiver(Socket),"接收服务").start();
new Thread(new ChatSend(Socket,targetport),"发送服务").start();
}catch(SocketException e) {
e.printStackTrace();
}
}
}
双方端口号必须相反且相同,且发送消息的服务端必须明确知道消息发送的目的地,即IP地址和端口号,同时一个聊天对象启动的程序服务既可以作为接收端也可以作为消息发送端。
实现聊天程序接收功能
package wlbc;
import java.net.*;
public class ChatReceiver implements Runnable {
//聊天程序收发平台 DatagramSocket对象
private DatagramSocket server;
public ChatReceiver(DatagramSocket server) {
this.server=server;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
//创建Datagrampacket数据包接收对象
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf,buf.length);
while(true) {
server.receive(packet);
//显示并打印聊天信息
String str = new String(packet.getData(),0,packet.getLength());
System.out.println("收到"+packet.getAddress()+":"+packet.getPort()+"发送的数据:"+str);
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
声明了一个DatagramSocket类型的server变量来表示聊天程序信息收发平台,并通过该类的构造方法获取具体的DatagramSocket实例对象,在run()方法中,通过while循环方法来持续接收发送到该DatagramSocket平台的信息,最后通过输出语句来显示接收到的聊天信息。
实现聊天程序信息发送功能
package wlbc;
import java.net.*;
import java.util.Scanner;
public class ChatSend implements Runnable {
//聊天程序信息发送平台 DatagramSocket对象
private DatagramSocket client;
//聊天对象的程序所在的服务端口号
private int targetport;
public ChatSend(DatagramSocket client,int targetport) {
this.client=client;
this.targetport=targetport;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
//书并获取键盘要发送的聊天信息
Scanner sc = new Scanner(System.in);
while(true) {
String data = sc.nextLine();
//封装数据到DatagramPacket数据包发送对象中
byte[] buf = data.getBytes();
DatagramPacket packet = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),targetport);
client.send(packet);
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
分别声明了名称为client和targetport的变量来表示聊天程序信息发送平台和要发送聊天信息的目标端口号,并通过该类的构造方法获取具体的DatagramPacket实例对象。在run()方法中,通过Scanner对象和循环方法获取键盘输入的聊天信息,接下来将获取到的数据封装到DatagramPacket对象中,最后通过DatagramPacket对象的send()方法发送数据。