我觉得楼主的程序设计是不是有问题。首先建立连接以后,会有一个Socket对象,你应该在第一次使用Socket连接的同时,把用户编号发过来,暂时用A,B标识,之后你应该保存一个2维的结构,最好是HashMap这种的,编号做Key,Socket做Value,这样你通过解析发送消息的目标,比如,A发给B,发送编号是A,接受者编号是B,你解析内容后,从Map里取B对应的socket对象,然后给B发。这样的顺序才对。你是不是搞混了,变成群发消息了?
调试欢乐多
开启端口:
while(true)
{
ServerSocket server_socket=new ServerSocket(i1); //i1是端口号
server threadServer=new server(server_socket.accept());
threadServer.start();
}
server类:
import java.io.*;
import java.net.*;
public class server extends Thread
{
int chatcreat;
private Socket myClient;
public server(Socket c)
{
this.myClient=c;
chatcreat=0;
} public void run()
{
try
{
BufferedReader in=new BufferedReader(new InputStreamReader(myClient.getInputStream()));
PrintWriter out=new PrintWriter(myClient.getOutputStream());
System.out.println("Wait for client to send string...");
//System.out.println("chatcreat="+chatcreat);
String name=in.readLine();
if((!name.equals(""))&&chatcreat==0)
{
chatcreat++;
new chatinter(name,myClient).start(); //在客户端发给服务器的第一条消息前先把客户端自定义的昵称发到服务器上。chatinter是对话界面
}
}
catch(IOException ex){}
finally{}
}
}界面中显示消息的部分:
try
{
BufferedReader in=new BufferedReader(new InputStreamReader(myClient.getInputStream()));
out=new PrintWriter(myClient.getOutputStream());
while(true)
{
String str=in.readLine();
a1.append(tit+":"+str+"\n");//a1是JTextArea,tit是前面传过来的客户端的昵称
}
}
catch (Exception e1)
{
System.out.println(e1);
}
{
//放在此处会创建多个ServerSocket
server threadServer=new server(server_socket.accept());
threadServer.start();
}
没道理串的
补充一下新发现的。第2个人连接以后第1个人的界面就失效了,不能发消息,按钮按了不会响应,消息也不会更新。我给第1个人发的消息也会显示到第2个人的界面里。原因是:你之前的代码每次均会创建一个新的ServerSocket对象,因此也就只有最新接入的Socket 有效
补充一下新发现的。第2个人连接以后第1个人的界面就失效了,不能发消息,按钮按了不会响应,消息也不会更新。我给第1个人发的消息也会显示到第2个人的界面里。原因是:你之前的代码每次均会创建一个新的ServerSocket对象,因此也就只有最新接入的Socket 有效那我该怎么解决呢。
这样做的话第2个人界面都不会出来了。。
补充一下新发现的。第2个人连接以后第1个人的界面就失效了,不能发消息,按钮按了不会响应,消息也不会更新。我给第1个人发的消息也会显示到第2个人的界面里。原因是:你之前的代码每次均会创建一个新的ServerSocket对象,因此也就只有最新接入的Socket 有效那我该怎么解决呢。
这样做的话第2个人界面都不会出来了。。界面和ServerSocket是没有关系的!
补充一下新发现的。第2个人连接以后第1个人的界面就失效了,不能发消息,按钮按了不会响应,消息也不会更新。我给第1个人发的消息也会显示到第2个人的界面里。原因是:你之前的代码每次均会创建一个新的ServerSocket对象,因此也就只有最新接入的Socket 有效那我该怎么解决呢。
这样做的话第2个人界面都不会出来了。。界面和ServerSocket是没有关系的!界面是收到第2个人连接才会出来的啊。
server threadServer=new server(server_socket.accept());这句拿到while外面不就只能接收1个客户端了么
补充一下新发现的。第2个人连接以后第1个人的界面就失效了,不能发消息,按钮按了不会响应,消息也不会更新。我给第1个人发的消息也会显示到第2个人的界面里。原因是:你之前的代码每次均会创建一个新的ServerSocket对象,因此也就只有最新接入的Socket 有效那我该怎么解决呢。
这样做的话第2个人界面都不会出来了。。界面和ServerSocket是没有关系的!界面是收到第2个人连接才会出来的啊。
server threadServer=new server(server_socket.accept());这句拿到while外面不就只能接收1个客户端了么首先:拿到外面的是 ServerSocket server_socket=new ServerSocket(i1); //i1是端口号
而不是accept你确定?ServerSocket监听客户端连接请求产生一个Socket不同Scoket之间无直接关联
额。我已经改成这样了: public void run()
{
try
{
i1=Integer.parseInt(t1.getText());
name=t2.getText();
if(name.equals(""))
System.out.println("请输入你的昵称!");
else
{
server_socket=new ServerSocket(i1);
indexset.connectsucceed();
//server threadServer;
while(true)
{
//System.out.println("Wait for client to connect...");
Socket a=server_socket.accept();
//server threadServer=new server(server_socket.accept());
server threadServer=new server(a);
threadServer.start();
}
}
}
catch(Exception e1){ System.out.println("ServerSocket启动失败!");};
}但是还是没解决。。我把所有的程序都上传了http://download.csdn.net/download/ww01055/6569887
是不是你对话框对象的引用出错了蛋疼。真的是。被你这么一提醒发现文本域写成static类型的了怪不得。辛苦楼上各位了。唉