java疑问---qq项目-----一对一聊天的疑问???

1.一对一聊天
如何进行一个真实的聊天呢???
首先,
我们先不考虑多人聊天,那么,客户端1能不能把信息直接发送给客户端2呢??
如果在没优化之前是不会的,但其实真实的qq ,是可以的,并且如果发现通信的双方都在同一个局域网,它可能不走服务器


现在,我们不考虑他们俩个不通过服务器实现通信。


只考虑借助于服务器中转。
那么怎么中转呢???
:::::::
1.服务器怎么才能把客户端1发来的hello传送给客户端2呢?


那么,服务器的策略是什么呢??
答: 服务器为了可以完成信息转发,
1.我们可以把服务器得到的每一个socket(和客户端建立的)
保存在Hashmap里面去,并且用一个客户ID去标识该socket。
2.当服务器和某个客户端形成一个连接时(socket),服务器端就单开一个线程,让这个线程与客户端通信。


3.为了服务器能够把客户端1,发来的信息,转发给客户端2,那么这个信息中必须,包含,发送者是谁?接收者是谁?


还有一点:
如何读取Message ???
:"线程创建之后,一定要记得启动!"








最为挠头的一点,那就是: 让服务器转发?
怎么让一号发给2号的信息,转发给2号?
:::::
1号发给2号的信息拿到之后,最关键的就是  要知道 2号和服务器达成的这个socket在哪里??
那么怎么定位这个socket呢???
解答:


我们回到服务器端,因为转发的任务是在服务器端完成的,不是在客户端,
所以,我们要回到线程处,
即: 在run()函数内,我们能直接取得,客户端2和服务器
建立的socket ,那么我们从哪里取呢?
那么,我们来看这一句话,
“我们可以把服务器得到的每个Socket保存在Hashmap中,用用户的Id标识该Socket”
怎么理解这句话???
:::::再创建一个类,用于管理客户端的线程

因为我们拿到客户端的线程的话,我们就能拿到这个线程里面的Socket 
:::
注意:需要把HashMap 做出静态的。


import java.util.*;


public  class ManageClientThread
{
public static HashMap hm=new HashMap<String,SerConClientThread>();
// 向hm中添加一个客户端通信线程
public void addClientThread(String uid,ClientThread ct)
{
hm.put(uid,ct);

}

// 
public SerConClientThread getClientThread(String uid)
{
return  (SerConClientThread)hm.get(uid);
}
}


那么,在服务器端,如何利用这个HashMap 呢?
看:
// 在服务器端为客户端单开一个线程,并把它划入到线程管理类SerConClientThead的管理范围中,


SerConClientThread  scct=new SerConClientThread(s);
ManageClientThread.addClientThread(uid=u.getUserId(),scct);
scct.start();


那么下面我就完成转发:
我的疑问:???
1.线程管理类的作用是什么??
  我们为什么要定义线程管理类???
2.我们利用线程管理类能得到什么??
3.我们是不是需要要在run()方法内定义 数据的发送?


SerConClientThread 的作用是什么???





总代码如下;



qq项目---一对一聊天
能不能在服务器端开个数组存储服务器建立的socket连接?
??


2.如何实现,如果好友在线,则显示彩色头像,反之,则显示灰色头像???
当好友在线时,则提示之,并播放提示声音。???







/*
韩老师说的话:
1.一对一聊天
如何进行一个真实的聊天呢???
首先,
我们先不考虑多人聊天,那么,客户端1能不能把信息直接发送给客户端2呢??
如果在没优化之前是不会的,但其实真实的qq ,是可以的,并且如果发现通信的双方都在同一个局域网,它可能不走服务器


现在,我们不考虑他们俩个不通过服务器实现通信。


只考虑借助于服务器中转。
那么怎么中转呢???
:::::::
1.服务器怎么才能把客户端1发来的hello传送给客户端2呢?


那么,服务器的策略是什么呢??
答: 服务器为了可以完成信息转发,
1.我们可以把服务器得到的每一个socket(和客户端建立的)
保存在Hashmap里面去,并且用一个客户ID去标识该socket。
2.当服务器和某个客户端形成一个连接时(socket),服务器端就单开一个线程,让这个线程与客户端通信。


3.为了服务器能够把客户端1,发来的信息,转发给客户端2,那么这个信息中必须,包含,发送者是谁?接收者是谁?
Message 
{
Private String mesType;
private String sender;
private String getter;
private String con;
private String sendTime;

}
\

在发送者哪一方,做好消息的封装
if(arg0.getSource()==jb)
{
//如果用户点击了,发送按钮
Message m=new Message();
m.setSender(this.ownerId);
m.setGettr(this.friendId);
m.setCon(jtf.getText());
// 消息封装好之后,就送到套接字流中,传送到服务器

// 把m 发送给服务器
 

}


还有一点:
如何读取Message ???
:"线程创建之后,一定要记得启动!"








最为挠头的一点,那就是: 让服务器转发?
怎么让一号发给2号的信息,转发给2号?
:::::
1号发给2号的信息拿到之后,最关键的就是  要知道 2号和服务器达成的这个socket在哪里??
那么怎么定位这个socket呢???
解答:


我们回到服务器端,因为转发的任务是在服务器端完成的,不是在客户端,
所以,我们要回到线程处,
即: 在run()函数内,我们能直接取得,客户端2和服务器
建立的socket ,那么我们从哪里取呢?
那么,我们来看这一句话,
“我们可以把服务器得到的每个Socket保存在Hashmap中,用用户的Id标识该Socket”
怎么理解这句话???
:::::再创建一个类,用于管理客户端的线程

因为我们拿到客户端的线程的话,我们就能拿到这个线程里面的Socket 
:::
注意:需要把HashMap 做出静态的。


import java.util.*;


public  class ManageClientThread
{
public static HashMap hm=new HashMap<String,SerConClientThread>();
// 向hm中添加一个客户端通信线程
public void addClientThread(String uid,ClientThread ct)
{
hm.put(uid,ct);

}

// 
public SerConClientThread getClientThread(String uid)
{
return  (SerConClientThread)hm.get(uid);
}
}


那么,在服务器端,如何利用这个HashMap 呢?
看:
// 在服务器端为客户端单开一个线程,并把它划入到线程管理类SerConClientThead的管理范围中,


SerConClientThread  scct=new SerConClientThread(s);
ManageClientThread.addClientThread(uid=u.getUserId(),scct);
scct.start();


那么下面我就完成转发:
我的疑问:???
1.线程管理类的作用是什么??
  我们为什么要定义线程管理类???
2.我们利用线程管理类能得到什么??
3.我们是不是需要要在run()方法内定义 数据的发送?


SerConClientThread 的作用是什么???






在 线程管理类中:如下;


Public class SerConClientThread extends Threads
{
// 为线程类添加,我们需要的属性成员。
// 添加Socket成员
Socket s=null;
// 


SerConClientThread(Socket s)
{
// 把服务器新生成的Socket连接,赋给线程

 this.s=s;

}
public void run()
{
while(true)
{
// 这里该线程可以接受客户端的信息
try{
ObjectInputStream ois =new ObjectInputStream(s.getInputStream());
Message m=(Message)ois.readLine();

// 完成转发
// 取得接收接收人的通信线程
SerConClientThread sc=ManageClientThread.getClientThread(m.getGetter());

ObjectInputStream oos=new ObjectInputStream(sc.s.getOutputStream());

oos.write(m);


}catch()
{

}

}
}



}










我们首先要明确一点:
就是:
线程其本质是类:
那么,线程既然是类,那么他有哪些属性呢??
他有提供哪些管理这些属性的方法呢???

我们是不是可以在线程类中定义:socket属性。


记住:线程是位于服务器端的。


每次有一个连接,服务器就生成一个线程对象来与该客户端通信。
所以,线程是开在服务器端,是属于服务器的。
所以,线程也就可以获取服务器所拥有的一些东西。









*/






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值