实验目的:
- 掌握IP地址和端口号的作用;
- 掌握InetAddress对象的使用;
- 掌握UDP和TCP通信方式。
实验内容:
模拟QQ和微信等社交软件,聊天程序要求通过监听指定的端口号、目标IP地址和目标端口号,实现消息的发送和接收功能,并把聊天内容显示出来。
实验步骤与调试过程:
(1)通过任务描述和运行结果图可以看出,此任务是使用多线程和UDP通信的相关知识实现的。要实现图中的聊天实口界面,首先就要定义一个实现聊天室功能的类,类中需要定义访问聊天室程序时的输出语句,以及获取输入的发送端口号、接收端口号和实现发送和接收功能的方法。
(2)实现发送数据功能。 该功能需要通过一个实现了Runnable 接口的类来实现, 类中需要定义获取发送数据的端口号,并在实现的run()方法中,编写发送数据的方法。
(3)实现接收数据功能。该功能也需要通过一一个实现了Runnable接口的类来实现,类中需要定义获取接收数据的端口号,并在实现的run()方法中,编写显示接收到的数据的方法。
(4)创建完所有的类和方法后,就可以通过运行两次程序,并同时开启两个窗口来实现聊天功能。
实验代码:
package CharRoom;
import java.util.Scanner;
public class CharRoom {
public static void main(String[] args) {
System.out.println("欢迎您进入聊天室~");
Scanner sc=new Scanner(System.in);
System.out.println("请输入本程序发送端端口号:");
int sendPort=sc.nextInt();
System.out.println("请输入本程序接收端端口号:");
int receivePort=sc.nextInt();
System.out.println("聊天系统启动~");
new Thread(new SendTask(sendPort),"发送端任务").start();
new Thread(new ReceiveTask(receivePort),"接收端任务").start();
}}
package CharRoom;
import java.net. DatagramPacket;
import java. net. DatagramSocket;
import java.net. InetAddress;
import java.util . Scanner;
public class SendTask implements Runnable{private int sendPort;
public SendTask (int sendPort) {
this. sendPort = sendPort;
}@Override
public void run(){
try {
DatagramSocket ds=new DatagramSocket();
Scanner sc =new Scanner (System. in);
while(true){
String data = sc.nextLine();
byte[]buf = data.getBytes() ;
DatagramPacket dp = new DatagramPacket (buf, buf.length,InetAddress .getByName ("127.0.0.255"), sendPort);
ds. send (dp);
}}catch (Exception e) {
e. printStackTrace() ;
}
}
}
package CharRoom;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveTask implements Runnable{
private int receivePort;
public ReceiveTask(int receivePort) {
this. receivePort =receivePort;
}
@Override
public void run() {
try {
DatagramSocket ds = new DatagramSocket (receivePort);
byte[]buf = new byte[1024];
DatagramPacket dp = new DatagramPacket (buf, buf.length);
while(true) {
ds.receive(dp) ;
String str=new String (dp .getData(), 0, dp.getLength());
System.out .println("收到" + dp .getAddress () .getHostAddress()+ "--发送的数据--"+ str);
}}
catch (Exception e) {
e.printStackTrace() ;
}}}