来来来,今天这篇博客,手把手教会你如何写一个在线聊天室,还学不会你来砍我
- 大家如果有什么疑问,欢迎在评论区讨论!
1、功能设计
-
实现两个用户之间的在线交流,没有群组功能。
-
键盘输入
-
控制台输出
2、技术分析
- 以下分析UDP和TCP都适用
- 首先我们可以很轻易的写出来两个功能Send和Receive,一个监听键盘输入,一个监听连接输入。怎么实现呢?两个功能里分别用上死循环就行了,判断输入是否为结束条件,是就跳出循环,关闭连接,否则就一直监听,这样就可以实现了。这部分代码可以看附件。
- 那么我们怎么让用户既能收,又能发呢?有人说了我们可以让一个用户既拥有Send方法,也拥有Receive方法,然后让这个用户分别执行两个方法就行了!NONONONONO!Too Yang Too 森破!事情没有那么简单,因为上面使用了死循环,所以如果先执行了接收,那么必然无法发送,如果先发送,必然无法接收!
- 从2的分析中我们得出,必须让收和发同步起来!没错,就是多线程!!!让每个用户开两个线程,不停的收和发,这样就可以建立连接了。那么只要把功能放进run函数里就可以了。
3、具体实现
3.1、UDP的实现
//发送方法实现类
package main.UdpChat;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
public class SendMessage implements Runnable {
//主要看run方法
public int port;//自己的端口名
public int toPort;//发送到哪个端口
public String toIp;//发送到哪个地址
public DatagramSocket socket = null;
public BufferedReader reader = null;
public SendMessage(int port, int toPort, String toIp) {
this.port = port;
this.toPort = toPort;
this.toIp = toIp;
try {
socket = new DatagramSocket(curport);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
//发送端
while(true)//不停的发
{
try {
reader = new BufferedReader(new InputStreamReader(System.in));
String data = reader.readLine();//获取输入,注意这里data最后没有\n,键盘中输入的是什么就是什么。 这里键盘输入是阻塞式输入,当没有输入的时候会在这里等待,不会向下执行。
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,
new InetSocketAddress(toIp,toPort));//打包
socket.send(packet);//发送 注意哦!这里send的是packet,和Tcp不同!!!
if(data.equals("bye"))
break;
}catch (Exception e)
{
System.out.println(e.getStackTrace());
}
}
socket.close();//关闭
}
}
//接收方法实现类
package main.UdpChat;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ReceiveMessage implements Runnable {
public int port;//自己的端口
public DatagramSocket socket = null;
public String who;//谁发给我的?
public ReceiveMessage(int port,String who) {
this.port = port;
this.who = who;
try {
socket = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true)
{
try {
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container, 0, container.length);//打包
socket.receive(packet);//接收数据
byte[] data = packet