一【实验目的】
- 掌握基于多线程的复杂网络程序的开发方法和开发流程;
- 按照要求设计实现软件,以培养应用复杂计算系统开发的能力,并在设计和开发过程中体现出创新意识。
二【实验要求】
以下每个实验均要求: - “实验源代码”处:粘贴所编写的程序源码,务必添加关键语句的注释;
- “实验结果”:截图(包括编写的程序和运行结果)粘贴到“实验结果”下方,截图需看到本人的名字及学号;
- 有“讨论”的题目,请务必认真回答;
二【实验内容】
1-1 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序。具体如下:
(1)、Tom和Jerry聊天的双方都应该具有发送端和接收端;
(2)、利用DatagramSocket与DatagramPacket;
(3)、实现 java.lang.Runnable类,重写 run()方法。
Sender.java
package net;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class Sender implements Runnable{
private DatagramSocket sender;
private BufferedReader reader;
private DatagramPacket packet;
private static final int MAX_RECEIVE_BUFFER = 1024;
private int localPort;//本进程端口
private String targetIP;//目标主机IP
private int targetPort;//目标主机端口
public Sender(int localPort,String targetIP,int targetPort){
this.localPort = localPort;
this.targetIP = targetIP;
this.targetPort = targetPort;
try {
sender = new DatagramSocket(localPort);//创建发送端
reader = new BufferedReader(new InputStreamReader(System.in));//创建文本输入器
}catch (Exception e){
e.printStackTrace();
}
}
@Override
//接收数据包
public void run() {
String input;
try {
while (true) {
input = reader.readLine();
byte[] datas = input.getBytes();
packet = new DatagramPacket(datas,0,datas.length,
new InetSocketAddress(this.targetIP,this.targetPort));
sender.send(packet);
if (input.equals("exit")||input.equals("bye")){
System.out.println("聊天结束");
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
sender.close();
try {
if(reader!=null){
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Receiver.java
package net;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Receiver implements Runnable {
private DatagramSocket receiver;
private DatagramPacket packet;
private String name;
private int local;//本进程端口
private static final int MAX_RECEIVE_BUFFER = 1024;
public Receiver(int local,String targetName){
this.local = local;
this.name = targetName;
}
@Override
//接收数据包
public void run() {
try {
receiver = new DatagramSocket(local);//创建接收端
while (true) {
byte[] buf = new byte[1024*60];
DatagramPacket data = new DatagramPacket(buf,0,buf.length);
receiver.receive(data);//阻塞
String input = new String(data.getData(),0,data.getLength());
System.out.println(name+":"+input);
if (input.equals("exit")||input.equals("bye")){
System.out.println("聊天结束");
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
receiver.close();
}
}
Jerry.java
package net;
public class Jerry {
public static void main(String[] args) {
System.out.println("洪致远 201931072217");
Thread thread1=new Thread(new Sender(4396,"localhost",2880));
Thread thread2=new Thread(new Receiver(7777,"Tom"));
thread1.start();
thread2.start();
}
}
Tom.java
package net;
public class Tom {
public static void main(String[] args) {
System.out.println("洪致远 201931072217");
Thread thread1=new Thread(new Receiver(2880,"Jerry"));
Thread thread2=new Thread(new Sender(6666,"localhost",7777));
thread1.start();
thread2.start();
}
}



