日志文章

2019-12-28 aflfte2011

UDP实现在线聊天模型

接收线程类:
package com.aflfte.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class TalkReceive implements Runnable {
private DatagramSocket server;
private String from;
public TalkReceive(String from,int port) {
this.from=from;
try {
server = new DatagramSocket(port);
} catch (SocketException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}

public void run() {
while(true) {
byte[] container=new byte[1024*60];
DatagramPacket packet=new DatagramPacket(container,0, container.length);
try {
server.receive(packet);
byte[] datas=packet.getData();
int len=packet.getLength();
String data=new String(datas,0,len);
System.out.println(from+":"+data);
if(data.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}

}
// 5、释放资源
server.close();
};
}

发送线程类
package com.aflfte.udp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class TalkSend implements Runnable {
private DatagramSocket client;
private BufferedReader reader;
private String ip;
private int toport;
public TalkSend(int port,String ip,int toport) {
this.ip=ip;
this.toport=toport;
try {
client = new DatagramSocket(port);
reader=new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

}
@Override
public void run() {
while(true) {
String data=null;
try {
data = reader.readLine();
byte[] datas=data.getBytes();
DatagramPacket packet=new DatagramPacket(datas, 0, datas.length,new InetSocketAddress(ip,toport));
client.send(packet);
if(data.equals("bye")) {
break;
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

}
//5、释放资源
client.close();
}
}
建立两个使用类启动线程可进行聊天
package com.aflfte.udp;
/**
 * 加入多线程实现双向交流
 * 模拟在线咨询
 * @author jinhao
 *
 */

public class TalkStudent {
public static void main(String[] args) {
new Thread(new TalkReceive("老师",9999)).start();
new Thread(new TalkSend(5566, "localhost", 8899)).start();
}
}

« 实现TCP连接并发送文字 | UDP发送与接收文件»