程序介绍:

实现简单的聊天室的功能,代码呢我只写了一方面的(即客户端发往服务端的)其实只写一端的代码就足够了

那么怎么才能实现聊天实的功能呢,就是要再将代码复制一份,两个人在两台PC上运行代码即可。

那么运行的时候需要修改什么呢,就是要需要修改一下IP地址和端口号。

Ip地址和端口号遵循这个员原则:客户端(发送端)设置的端口号要和服务端(接收端)的端口号相对应。

这样才能保证通信的畅通。(还不明白的在去看下面的main函数,再不明白的加我QQ私聊我)

结构体系:

UDP实现简单的聊天室功能

 大体思路:

客户端:将数据打包,然后附上接收方的IP地址,然后将数据发送出去。

服务端:接收数据,然后将数据拆包,进行数据包的解析。

用到的类和方法:

InetAddress类;

获取IP地址

UDP实现简单的聊天室功能

将IP地址以字符串的形式表示出来

UDP实现简单的聊天室功能 

此方法中的参数可以为Ip地址额字符串形式。

UDP实现简单的聊天室功能 

 

DatagramSocket类;

UDP实现简单的聊天室功能

DatagramPacket类;

UDP实现简单的聊天室功能

 获得发送数据的长度

UDP实现简单的聊天室功能 

获得发送数据的内容

UDP实现简单的聊天室功能 

下面两个类是用来读数据的

字节流的形式读取,然后用高效字节流缓冲区来高效读取

BufferedRead类;

InputStreamReader类;

服务端的代码:

package com.klj.chatroomS;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class ChatRoomServer implements Runnable {

	/**
	 * 聊天室的服务端 1、创建套接字对象,指定服务端口 2、接收客户端发送过来的数据包 3、对数据包进行解析 4、关闭服务
	 */
	private int port;

	public void setPort(int port) {
		this.port = port;
	}

	public int getPort() {
		return port;
	}

	@Override
	public void run() {
		DatagramSocket ds = null;

		try {
			/**
			 * 接收数据包
			 */
			// 创建套接字对象,必须指定端口,接口一般大于8000
			ds = new DatagramSocket(port);
	
			byte[] bytes = new byte[1024];
			// 创建数据包,用来装数据
			DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

			System.out.println("====服务端已启动,等待接收数据====");
			while(true) {
			// 接收数据包
			ds.receive(dp);

			/**
			 * 解析数据包
			 */

			// 获取到数据包的IP地址
			InetAddress iadd = dp.getAddress();
			// 获取到数据包中的数据
			byte[] bytes1 = dp.getData();

			// 获得到接收数据的长度
			int length = dp.getLength();

			// 重新组装接收到的数据,即:将字节转换成字符串
			String data = new String(bytes1, 0, length);
			if ("exit".equals(data)) {
				System.out.println("数据发送完毕");
			}

			// 输出数据
			System.out.println("服务端" + iadd.getHostAddress() + "接收了:" + data);
			System.out.println("请再次输入您要发送的数据:");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭套接字,释放资源。
			if (ds != null) {
				ds.close();
			}
		}

	}


}

 客户端的代码:

package com.klj.chatroomS;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class ChatRoomClient implements Runnable {

	//声明ip地址和端口。
	private String ip;
	private int port;
	//设置set和get方法
	int getPort() {
		return port;
	}

	void setPort(int port) {
		this.port = port;
	}

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	@Override
	public void run() {
		/**
		 * 客户端的代码 1、将数据进行封装,并附上IP地址 2、发送数据 3、关闭服务
		 */
		BufferedReader br = null;
		DatagramSocket ds = null;
		try {

			ds = new DatagramSocket();
			System.out.println("请输入您要发送的数据:");
			/**
			 * 打包数据
			 */
			while (true) {
				
				br = new BufferedReader(new InputStreamReader(System.in));
				String str = br.readLine();
				// 定义数据包中要发送的的内容
				byte[] bytes = str.getBytes();

				int length = bytes.length;

				// 创建要发送的目的地的IP
				InetAddress address = InetAddress.getByName(ip);

				// 打包数据
				DatagramPacket dp = new DatagramPacket(bytes, length, address, port);

				// 发送数据
				ds.send(dp);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (ds != null) {
				ds.close();
			}
			if (br != null) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

main函数:

package com.klj.chatroomS;

public class Run {

    public static void main(String[] args) {
        
        //创建服务端对象
        ChatRoomServer chatroomserver = new ChatRoomServer();
        chatroomserver.setPort(12234);
        
        //创建客户端对象
        ChatRoomClient chatroomclient = new ChatRoomClient();
        chatroomclient.setIp("192.168.43.163");
        chatroomclient.setPort(12233);

        //创建线程
        Thread serverThread =new Thread(chatroomserver);
        Thread cilentThread =new Thread(chatroomclient);
        //启动线程
        serverThread.start();
        cilentThread.start();
        
    }

}
package com.klj.chatroomXS;

public class Run {

	public static void main(String[] args) {

		// 创建服务端对象
		ChatRoomServer chatroomserver = new ChatRoomServer();
		chatroomserver.setPort(12233);
		// 创建客户端对象
		ChatRoomClient chatroomclient = new ChatRoomClient();
		chatroomclient.setIp("192.168.43.163");
		chatroomclient.setPort(12234);
		// 创建线程
		Thread serverThread = new Thread(chatroomserver);
		Thread cilentThread = new Thread(chatroomclient);
		// 启动线程
		serverThread.start();
		cilentThread.start();
	}

}

 

最后附上的我的QQ:3030363140(有三个验证问题,第一个问题输上你的名字,其余的可以随便写),欢迎大家骚扰哦。

 

相关文章: