小白必懂!使用TCP或者UDP实现在线聊天!

来来来,今天这篇博客,手把手教会你如何写一个在线聊天室,还学不会你来砍我

  • 大家如果有什么疑问,欢迎在评论区讨论!

1、功能设计

  • 实现两个用户之间的在线交流,没有群组功能。

  • 键盘输入

  • 控制台输出

2、技术分析

  • 以下分析UDP和TCP都适用
  1. 首先我们可以很轻易的写出来两个功能Send和Receive,一个监听键盘输入,一个监听连接输入。怎么实现呢?两个功能里分别用上死循环就行了,判断输入是否为结束条件,是就跳出循环,关闭连接,否则就一直监听,这样就可以实现了。这部分代码可以看附件。
  2. 那么我们怎么让用户既能收,又能发呢?有人说了我们可以让一个用户既拥有Send方法,也拥有Receive方法,然后让这个用户分别执行两个方法就行了!NONONONONO!Too Yang Too 森破!事情没有那么简单,因为上面使用了死循环,所以如果先执行了接收,那么必然无法发送,如果先发送,必然无法接收!
  3. 从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
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值