java socket 多人单对单聊天 客户端的接受问题
原本想的是每新建一个聊天窗口就给它一个新建一个线程,内部实现socket的接受死循环!不过这个方法好像不行啊!因为一旦新建了一个窗口后它就会把socket的接受给占用了,...
原本想的是每新建一个聊天窗口就给它一个新建一个线程,内部实现socket的接受死循环!
不过这个方法好像不行啊!因为一旦新建了一个窗口后它就会把socket的接受给占用了,那么再新建聊天窗口应该就无法接收了!(不知道这个猜想是否正确)
高手给个解决方案!!多谢啦! 展开
不过这个方法好像不行啊!因为一旦新建了一个窗口后它就会把socket的接受给占用了,那么再新建聊天窗口应该就无法接收了!(不知道这个猜想是否正确)
高手给个解决方案!!多谢啦! 展开
5个回答
展开全部
我也写过这样的程序,你的意思是只用一个socket然后让他接受信息吧,这样当然不行,既然有单对单的聊天,那么当客户A同时跟客户B客户C聊天的时候会使用到多个socket的.
我当时用的方法是用一个线程来监听来自其他客户的聊天请求的连接,当他接收到聊天请求的时候将socket直接传递给客户聊天线程ServerHold类来处理聊天事件,自己继续等待客户的连接.在程序中用一个Clent类来管理其他用户的信息 比如Clent有一个属性就是ServerHold类的实例
class Clent{
......
public ServerHold sh;
......
}
然后用一个ClentHost类
class ClentHost{
static Clent[] cs = new Clent[10];
public add(Clent clent){}
public del(Clent clent){}
public get(String name){}
}的实例来管理所有的Clent客户类
大体实例是:
class ServerWating extends Thread{
ServerSocket server;
Socket socket;
public ServerWating(){
try{
//监听端口
server = new ServerSocket(12345);
}catch(Exception e){
e.printStackTrace(System.out);
System.out.println("对不起,监听线程出错");
System.exit(0);
}
}
public void run(){
while(true){
try{
//等待用户连接
socket = server.accept();
//连接上后 将所得的socket 传递给ServerHold线程类并实例化 具体ServerHold类的参数你可以自己根据需求来写
ServerHold sh = new ServerHold(socket);
//启动该ServerHold线程
sh.start();
}catch(Exception e){
e.printStackTrace(System.out);
System.out.println("对不起,监听线程出错");
}
}
}
}
然后是与用户交互的类 ServerHold
class ServerHold extends Thread{
Socket socket;
public ServerHold(Socket socket){
this.socket = socket;
}
//用线程不停的读取对方发来的信息,避免信息的阻塞
public void run(){
try{
//根据socket新建输入流
while(true){
//读取对方发送的信息并从中获取对方的姓名,根据情况,或新建Clent然后将this(ServerHold类的本对象)添加到Clent或直接添加到已有的Clent
//读取对方发送的信息并反馈到程序
}
}catch(Exception e){
//当对方下线会出现错误时保证线程安全退出
}
}
//发送信息到对方,可以根据实际情况来确定方法的参数等内容,然后根据程序的需要直接调用
//在连接建立的时候,要发送一次自己的客户端信息,比如name什么的到对方以便其保存.
public void set(){
//根据socket取得输出流
}
}
当然,上面都是被动连接的,主动连接差不多,也是要根据连接后的socket来新建一个ServerHold类然后进行交互.
大体思想就是这样子的,当然 实现的时候会有好多困难,449775695我的QQ,有什么问题可以来问我.
我当时用的方法是用一个线程来监听来自其他客户的聊天请求的连接,当他接收到聊天请求的时候将socket直接传递给客户聊天线程ServerHold类来处理聊天事件,自己继续等待客户的连接.在程序中用一个Clent类来管理其他用户的信息 比如Clent有一个属性就是ServerHold类的实例
class Clent{
......
public ServerHold sh;
......
}
然后用一个ClentHost类
class ClentHost{
static Clent[] cs = new Clent[10];
public add(Clent clent){}
public del(Clent clent){}
public get(String name){}
}的实例来管理所有的Clent客户类
大体实例是:
class ServerWating extends Thread{
ServerSocket server;
Socket socket;
public ServerWating(){
try{
//监听端口
server = new ServerSocket(12345);
}catch(Exception e){
e.printStackTrace(System.out);
System.out.println("对不起,监听线程出错");
System.exit(0);
}
}
public void run(){
while(true){
try{
//等待用户连接
socket = server.accept();
//连接上后 将所得的socket 传递给ServerHold线程类并实例化 具体ServerHold类的参数你可以自己根据需求来写
ServerHold sh = new ServerHold(socket);
//启动该ServerHold线程
sh.start();
}catch(Exception e){
e.printStackTrace(System.out);
System.out.println("对不起,监听线程出错");
}
}
}
}
然后是与用户交互的类 ServerHold
class ServerHold extends Thread{
Socket socket;
public ServerHold(Socket socket){
this.socket = socket;
}
//用线程不停的读取对方发来的信息,避免信息的阻塞
public void run(){
try{
//根据socket新建输入流
while(true){
//读取对方发送的信息并从中获取对方的姓名,根据情况,或新建Clent然后将this(ServerHold类的本对象)添加到Clent或直接添加到已有的Clent
//读取对方发送的信息并反馈到程序
}
}catch(Exception e){
//当对方下线会出现错误时保证线程安全退出
}
}
//发送信息到对方,可以根据实际情况来确定方法的参数等内容,然后根据程序的需要直接调用
//在连接建立的时候,要发送一次自己的客户端信息,比如name什么的到对方以便其保存.
public void set(){
//根据socket取得输出流
}
}
当然,上面都是被动连接的,主动连接差不多,也是要根据连接后的socket来新建一个ServerHold类然后进行交互.
大体思想就是这样子的,当然 实现的时候会有好多困难,449775695我的QQ,有什么问题可以来问我.
展开全部
客户端需要开启一个单独的线程,去读取服务端发送过来的消息。这个线程应该是个死循环(不必担心会不会很耗内存,因为你这个线程里面要读取的数据来自于socket的另外一方Output出来的数据,实际上是IO阻塞的方法,所以,只有对方Output一条数据这里才会循环一次)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
主线程接收别人的连接,死循环,连接后的处理交给新的线程。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你是固定监听一个指定的端口吗?
网络服务端通常是监听一个端口,用于接收“申请”请求(如HTTP服务器的80端口)。
在接到请求后,会重新分配一个新的端口和客户端进行通讯。这样原端口就不会被占用了。
JAVA里有一个类,java.net.ServerSocket。可以自动处理这些细节。
网络服务端通常是监听一个端口,用于接收“申请”请求(如HTTP服务器的80端口)。
在接到请求后,会重新分配一个新的端口和客户端进行通讯。这样原端口就不会被占用了。
JAVA里有一个类,java.net.ServerSocket。可以自动处理这些细节。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、聊天室的原理就是服务端建立socket监听,客户端建立socket客户端与服务端socket交互,服务端通过广播或单通道的方式将处理后的数据下发
2、服务端需要建立socket服务,采用何种技术不重要,java/c/.net这些都可以
3、客户端需要实现socket客户端,采用何种技术也不重要,java/c/.net这些都可以
4、服务端与客户端的交互报文协议和交互流程需要事先约定好
5、具体实现举例,给你提供个思路:
a. 服务端使用java编写,编译后启动,启动后就是实现一个socket的服务端,网上很多类似代码,在linux下安装一个jre就可以了
b.服务端采用C实现socket服务端,可以考虑使用ACE框架来简化开发,linux下g++编译很方便,编译后直接运行,前提是ACE等相关工具和环境需要配置好
c.服务端构建一个J2EE的web应用,然后在linux下部署在tomcat下,启动部分与方法a一致
6、其实很简单,关键是了解聊天室的原理其实就是一个套接字通讯,与具体的技术或编程工具无关
2、服务端需要建立socket服务,采用何种技术不重要,java/c/.net这些都可以
3、客户端需要实现socket客户端,采用何种技术也不重要,java/c/.net这些都可以
4、服务端与客户端的交互报文协议和交互流程需要事先约定好
5、具体实现举例,给你提供个思路:
a. 服务端使用java编写,编译后启动,启动后就是实现一个socket的服务端,网上很多类似代码,在linux下安装一个jre就可以了
b.服务端采用C实现socket服务端,可以考虑使用ACE框架来简化开发,linux下g++编译很方便,编译后直接运行,前提是ACE等相关工具和环境需要配置好
c.服务端构建一个J2EE的web应用,然后在linux下部署在tomcat下,启动部分与方法a一致
6、其实很简单,关键是了解聊天室的原理其实就是一个套接字通讯,与具体的技术或编程工具无关
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询