一个简单的Java聊天程序

这是一个简单的UDP通信,其中有一个小知识非常需要注意,因为我已经和一个秀儿(^_−)☆进行了远程通信,最后失败了,得了一个花费几个小时的教训,此聊天程序只可用于局域网。若发现下面的代码可以优化的地方望指出,谢谢啦|ू・ω・` )
/*需求:用两台电脑根据IP地址可以在dos命令行中进行简单的聊天程序

  • 思路:

  • 一、发送端:

  • 1、建立udp socket服务

  • 2、提供数据,因为我们要键盘录入,那键盘录入就要用到IO流啦,还要用到服务器的堵塞式方法,将数据封装到数据包中

  • 3、通过socket服务的发送功能,将数据包发出去

  • 二、接收端:

  • 1、同样建立udp socket服务

  • 2、定义一个数据包,用于存储接收的字节数据

  • 3、通过socket服务把接收的数据存入数据包中

  • 4、将数据包中的数据取出到控制台上

  • 聊天程序!??是一个可以发送、接收的程序,说明是一个同时进行发送端、接收端的程序,那么必然要用到多线程。

  • 步骤:

  • 1、通过DatagramSocket对象,创建udp服务

  • 2、通过DatagramPacket(byte[] buf, int length, InetAddress address, int port)方法,确定数据,并封装成数据包

  • 3、通过socket服务,将数据包发送出来,用send方法。

  • 4、通过receive方法将收到的数据存入数据包中,然后通过数据包的方法获取其中的数据
    */
    下面是要用到的方法详细说明:

    static InetAddress getByName(String host)         在给定主机的情况下确定主机的IP地址
    String getHostAddress()                           返回InetAddress实例对应的IP地址字符串
    public DatagramPacket(byte[] buf, int length)     构造DatagramPacket,用来接收长度为length的数据包
    public DatagramPacket(byte[] buf, int length, InetAddress address,int port)         构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号
    InteAddress getAddress()                          返回某台机器的IP地址,此数据报将要发往该机器或者是从该机器接收的
    byte[] getData()                                  返回数据缓冲区
    int getLength()                                   返回将要发送或接收到的数据长度
    void receive(DatagramPacket p)                    从此套接字接收数据报包
    void send(DatagramPacket p)                       从此套接字发送数据报包
    

下面便是以上方法的运用:

import java.io.*;
import java.net.*;
class Sender implements Runnable{
	private DatagramSocket ds;
public Sender(DatagramSocket ds) {
	this.ds = ds;
}
public void run() {
	try {
		//通过DatagramPacket(byte[] buf, int length, InetAddress address, int port)方法,确定数据,并封装成数据包
		BufferedReader bfrd = new BufferedReader(new InputStreamReader(System.in));
		String line = null;
		while((line = bfrd.readLine()) != null) {
			if("bye".equals(line)) {
				System.out.println("聊天结束!");
				break;
			}
			byte[] buf = line.getBytes();
			DatagramPacket dp = 
					new DatagramPacket(buf, buf.length,InetAddress.getByName("对方电脑的IP地址"),端口);
			//通过socket服务,将数据包发送出来,用send方法。
			ds.send(dp);
		}
	}catch(Exception e) {
		throw new RuntimeException("发送端错误!");
    	}
	}
}
class Receiver implements Runnable {
	private DatagramSocket ds;
public Receiver(DatagramSocket ds) {
	this.ds = ds;
}
public void run() {
	try {
		while(true) {
			//定义数据包
			byte[] buf = new byte[1024];
			DatagramPacket dp = new DatagramPacket(buf, buf.length);
			//通过服务的receive方法将收到的数据存入数据包中
			ds.receive(dp);           //堵塞式方法
			//通过数据包的方法获取其中的数据
			String ip = dp.getAddress().getHostAddress();
			String data = new String(dp.getData(), 0, dp.getLength());
			System.out.println(ip + ":" + data);
		}
	}catch(Exception e) {
		throw new RuntimeException("接收端错误!");
    	}
	}
}
public class Liaotian {
public static void main(String[] args) throws Exception{
	//通过DatagramSocket对象,创建udp服务
	DatagramSocket sendSocket = new DatagramSocket();
	DatagramSocket receSocket = new DatagramSocket(端口);
	new Thread(new Sender(sendSocket)).start();
	new Thread(new Receiver(receSocket)).start();
	System.out.println("聊天开始了喔:");
	}
}

运行的成果如下:
在这里插入图片描述
端口写一个数字,建议0~1024之间的值不要使用,不过两台电脑的端口数字要相同,而且需要注意的是:每一次的编译和运行,端口只能编译一次,如果第二次编译那么在运行的时候会报错,因为原来的端口已经被占用了。
这一次的记录就到这里啦(σ゚∀゚)σ…:*☆哎哟不错哦。

发布了5 篇原创文章 · 获赞 28 · 访问量 4813

猜你喜欢

转载自blog.csdn.net/weixin_45537947/article/details/104137778