基于UDP的聊天室

项目结构

在这里插入图片描述
data.java

package udp;

import java.net.InetAddress;

public class data {
	InetAddress Address;
	int Port;
	public InetAddress getAddress() {
		return Address;
	}
	public void setAddress(InetAddress address) {
		Address = address;
	}
	public int getPort() {
		return Port;
	}
	public void setPort(int port) {
		Port = port;
	}
}

服务器端

Server.java

package udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.ArrayList;

public class Server {
	DatagramSocket socket = null;	
	ArrayList<data> client;
	
	public Server() { 
		try {
			socket = new DatagramSocket(8888);
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		client = new ArrayList<data>();
	}
	
	public void s_r(){
		try {
			
			while(true) {
				byte[] buf = new byte[3000];
				//接收数据的数据包
				DatagramPacket packet = new DatagramPacket(buf,buf.length);
				socket.receive(packet);
				//地址
				InetAddress clientAddress = packet.getAddress();
				//端口号				
				int clientPort = packet.getPort();
				data d = new data();
				d.setAddress(clientAddress);
				d.setPort(clientPort);
				int i=0;
				//判断客户端集合里是否存在发送新消息的客户端
				for(;i<client.size();i++) {
					if(client.get(i).getAddress().equals(clientAddress)&&client.get(i).getPort()==clientPort) {
						break;
					}
				}
				if(i==client.size()) {
					client.add(d);
				}
				String s=new String(packet.getData()).trim()+"来自:"+clientAddress.getHostAddress()+":"+clientPort;
				System.out.println(s);
				//把信息发给每个客户端
				for(data c:client) {
					try {
						//地址
						InetAddress cAddress = c.getAddress();
						//端口号
						int cPort = c.getPort();
						
						buf = s.getBytes();
						//创建要发送的数据包
						packet = new DatagramPacket(buf,buf.length,cAddress,cPort);
						socket.send(packet);
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}				
			}
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(socket!=null)socket.close();
		}
		
	}		
	public static void main(String[] args) {
		Server s = new Server();
		s.s_r();
	}
}

客户端

package udp;

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

public class Client {
	DatagramSocket socket = null;
	DatagramPacket packet;
	InetAddress address = null;
	Client(){
		try {
			socket = new DatagramSocket();
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
	
	public void s_r() {
		try {
			// 把表示服务器端IP地址的字符串转换成InetAddress对象
			address = InetAddress.getByName("127.0.0.1");
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
		}		
		String s = "登陆";
		byte[] b = s.getBytes();
		packet = new DatagramPacket(b,b.length,address,8888);
		try {
			socket.send(packet);
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		//发送消息的线程
			new Thread(new Runnable() {
				@Override
				public void run() {
					// TODO Auto-generated method stub
					String sendStr;
					BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
					try {
						while((sendStr = stdIn.readLine())!=null) {
							byte[] buf = sendStr.getBytes();
							packet = new DatagramPacket(buf,buf.length,address,8888);
							socket.send(packet);
						}
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}					
				}
				
			}).start();

			//接收消息的线程
			new Thread(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub
					byte[] buf_1 = new byte[3000];
					// 使用空字节数组构造空数据包
					DatagramPacket packet = new DatagramPacket(buf_1,buf_1.length);
					try {
							while(true) {
								socket.receive(packet);
								String received = new String(packet.getData(),0,packet.getLength()).trim();
								System.out.println("接收到的信息:"+received);	
							}
										
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}).start();
	}
	
	public static void main(String[] args) {
		Client c = new Client();
		c.s_r();
	}	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值