关于解决打开多个文本聊窗口的端口占用问题的若干想法(官话~)

最近在整一个仿feiq的聊天的软件的,但是由于网络知识的和各方面的匮乏~问题多多!

该软件不存在任何的服务器进行转发!而直接的端对端的进行udp通信...对所有的文本聊天窗口都设置为8888端口进行接收(也就是说所有的都是发送到对方机子的8888端口上)~

这样暂时就会有2个问题:

1:本来是一个聊天的窗口对应着一个ip,直接到聊天窗口的那个类中进行接收的话,会接收到其他主机发生弄个过来的信息,但是这个问题可以用判断数据的来之的ip来进行区分!

2:当我们要进行多人聊天的时候,需要打开多个俩天窗口,这个端口8888就会被占用了,无法打开多个!

解决的思路,在每个客户端上创建一个用于专门接受所有主机发送过来的信息,并对所有的信息进行甄别、存储,有聊天的窗口对其存储的内容进行获取

下面是今天晚上写的代码:并没有严格的测试!只是思路而已!

package binary.net;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.HashMap;
import java.util.Iterator;
/**
 * @author 后飞IT
 * 这个类的功能:
 * 		 1、 用于接收其他的主机发送过来的所有的文本的信息
 * 		 2、对所有的所有的信息进行转发
 */
public class self_Server implements Runnable {
	/**
	 * map是用于存储进行了文本聊天的窗口,该窗口时用于聊天主机的ip地址进行标识的
	 */
	static HashMap<String,String> map=null;
	/**
	 * 通过这个类方法对可以使得聊天串口得以对map进行注册
	 * @param ip 利用本机与局域网中通信的机器的ip对聊天的窗口的标识
	 */
	public static void insertInfo(String ip){
		map.put(ip, "");
	}
	/**
	 * 通过聊天窗口标识的ip来获取self_Server中有关自己信息
	 * @param ip
	 * @return
	 */
	public static String getInfo(String ip){
		Iterator<String> ite=map.keySet().iterator();
		String temp="";
		while(ite.hasNext()){
			temp=ite.next();
			System.out.println(temp);
			if(temp.equals("/"+ip)){
				break;
			}
		}
		if(temp.equals("")){
			return "";
		}else{
			return map.get(temp);
		}
	}
	/**
	 * 对ip存在于map表中的ip的信息进行存储
	 * @param ip
	 * @param msg 其他的主机发送过来的信息
	 */
	public static void setInfo(String ip,String msg){
		Iterator<String> ite=map.keySet().iterator();
		String temp="";
		while(ite.hasNext()){
			temp=ite.next();
			if( ("/"+temp).equals(ip)){
				map.put(temp, msg);
//				System.out.println(temp);
//				System.out.println(map.get(temp));
				break;
			}
		}
		
	}
	/*测试
	public static void main(String[] args){
		map.put("127.0.0.1","12");
		map.put("127.0.0.2","");
		setInfo("/127.0.0.2","shezhi ");
		System.out.println(getInfo("127.0.0.2"));
	}
	*/
	@Override
	public void run() {
		map=new HashMap<String,String>();
		DatagramPacket pack = null;
		DatagramSocket mail_data = null;
		byte data[] = new byte[8192];
		try{
			pack = new DatagramPacket(data, data.length);
			mail_data = new DatagramSocket(8888);
		}catch (Exception e) {
			
		}
		//一直获取信息
		while (true){
					try{
						mail_data.receive(pack);
						int length = pack.getLength();
						//String message =pack.getAddress().toString()+ new String(pack.getData(), 0, length);
						//对有在map中存在了的ip地址的信息进行存储,其他抛弃
						setInfo(pack.getAddress().toString(),new String(pack.getData(), 0, length));
					}catch (Exception e){
						e.printStackTrace();
						System.out.println("接收数据失败!");
					}
		}
	}
}

大家如果有什么好的意见,请提出来的!有同样做这个东西的也可以来交流下~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值