前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >​Java实现人与人之间的聊天

​Java实现人与人之间的聊天

原创
作者头像
ruochen
修改2021-11-20 15:57:48
6820
修改2021-11-20 15:57:48
举报

一、首先先把接受端与发送端的基本代码写好

1.发送端代码

代码语言:txt
复制
@发送端代码
	import java.io.BufferedReader;
	import java.io.InputStreamReader;
	import java.net.DatagramPacket;
	import java.net.DatagramSocket;
	import java.net.InetAddress;
	
	public class Send_Client {<!-- -->

	    public static void main(String[] args) throws Exception{<!-- -->
	        DatagramSocket socket=new DatagramSocket();
	        while (true){<!-- -->
	            //直接从控制台中读取数据
	            BufferedReader data=new BufferedReader(new InputStreamReader(System.in));
	            String datas = data.readLine();
	            //将数据转换为可以传输的字节
	            byte[] send_data = datas.getBytes();
	            DatagramPacket packet = new DatagramPacket(send_data,0,send_data.length, new InetSocketAddress("127.0.0.1",888));
	            socket.send(packet);
	            //这里时设置他们怎么结束,可以自行展开
	            if(datas.equals("bye")){<!-- -->
	                break;
	            }
	        }
	        socket.close();
	    }
	}

2.接受端代码

代码语言:txt
复制
	import java.net.DatagramPacket;
	import java.net.DatagramSocket;
	
	public class Receiver_Client {<!-- -->
	    public static void main(String[] args)throws Exception {<!-- -->
	        DatagramSocket socket = new DatagramSocket(888);
	        while(true){<!-- -->
	            byte[] buffer =new byte[1024];
	            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
	            socket.receive(packet);
	            byte[] data = packet.getData();
	            String real_data = new String(data, 0, data.length);
	            real_data=real_data.trim();
	            if(real_data.equals("bye")){<!-- -->
	                break;
	            }
	            System.out.println(real_data);
	        }
	        socket.close();
	    }
	}
	
注意:接受bye时要对字符串进行去空格操作,要不然无法退出,字符串.trim()即可

二、对代码进行改造为多线程

1.发送端线程

代码语言:txt
复制
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;

public class TalkSend implements Runnable{<!-- -->
    DatagramSocket socket=null;
    BufferedReader data=null;
    private int fromPort;
    private String toIP;
    private int toPort;

    public TalkSend(int fromPort, String toIP, int toPort) {<!-- -->
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;
        try {<!-- -->
            socket=new DatagramSocket(this.fromPort);
        } catch (SocketException e) {<!-- -->
            e.printStackTrace();
        }
        data=new BufferedReader(new InputStreamReader(System.in));
    }

    @Override
    public void run() {<!-- -->
        while (true) {<!-- -->
            try {<!-- -->
                //直接从控制台中读取数据
                String datas = data.readLine();
                //将数据转换为可以传输的字节
                byte[] send_data = datas.getBytes();
                DatagramPacket packet = new DatagramPacket(send_data, 0, send_data.length, new InetSocketAddress(this.toIP,this.toPort));
                socket.send(packet);
                if (datas.equals("bye")) {<!-- -->
                    break;
                }
            }catch (Exception e){<!-- -->
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

2.接收端线程

代码语言:txt
复制
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class TalkReceive implements Runnable {<!-- -->
    DatagramSocket socket=null;
    private int myPort;
    private String msg;

    public TalkReceive(int myPort,String msg) {<!-- -->
        this.myPort = myPort;
        this.msg=msg;
        try {<!-- -->
            socket = new DatagramSocket(this.myPort);
        } catch (SocketException e) {<!-- -->
            e.printStackTrace();
        }
    }

    @Override
    public void run() {<!-- -->
        while(true){<!-- -->
            try{<!-- -->
                byte[] buffer =new byte[1024];
                DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
                socket.receive(packet);
                byte[] data = packet.getData();
                String real_data = new String(data, 0, data.length);
                real_data=real_data.trim();
                if(real_data.equals("bye")){<!-- -->
                    break;
                }
                System.out.println(this.msg+":"+real_data);
            }catch (Exception e){<!-- -->
                e.printStackTrace();
            }

            }
        socket.close();
    }
}

3.总体的主方法

代码语言:txt
复制
public class Teacher {<!-- -->
    public static void main(String[] args) {<!-- -->
    new Thread(new TalkSend(5555,"127.0.0.1",9999)).start();
    new Thread(new TalkReceive(5678,"学生")).start();
    }
}
代码语言:txt
复制
public class Student {<!-- -->
    public static void main(String[] args) {<!-- -->
        new Thread(new TalkSend(7777,"127.0.0.1",5678)).start();
        new Thread(new TalkReceive(9999,"老师")).start();
    }
}

然后你就可以进行聊天了,想在局域网聊天,只要打开自己电脑对应的端口和另一台主机的端口,就可以进行相互的通信了

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、首先先把接受端与发送端的基本代码写好
  • 二、对代码进行改造为多线程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档