正在做软件开发实习的小软件现在已经实现的功能:1、多个客户端连接到服务器端;
2、多个客户端的信息通信
3、服务器端显示任意一个连接的客户端发送的信息遇到一个问题:多个客户端连接到服务器端,把连接的客户端(自定义类Client)存到一个类型为arraylist的容器里,然后显示到一个List(java.awt)里现在想在服务器端向任意一个连接的客户端发送信息具体想法是:鼠标单击任意一个List里的客户端连接的IP,然后在服务器端的一个文本框里输入数据点击一个Button,把信息发送到选定的客户端idea:写一个单独的线程,专门用来服务器端向客户器端发送信息,点击button的时候触发这个线程实现这个功能自己遇到的难题是:服务器端如何向一个特定的客户端发送信息???(我知道怎么向多个客户端发送)
2、多个客户端的信息通信
3、服务器端显示任意一个连接的客户端发送的信息遇到一个问题:多个客户端连接到服务器端,把连接的客户端(自定义类Client)存到一个类型为arraylist的容器里,然后显示到一个List(java.awt)里现在想在服务器端向任意一个连接的客户端发送信息具体想法是:鼠标单击任意一个List里的客户端连接的IP,然后在服务器端的一个文本框里输入数据点击一个Button,把信息发送到选定的客户端idea:写一个单独的线程,专门用来服务器端向客户器端发送信息,点击button的时候触发这个线程实现这个功能自己遇到的难题是:服务器端如何向一个特定的客户端发送信息???(我知道怎么向多个客户端发送)
我以前用的是Corba,采用回调技术特别简单。
我以前用的是Corba,采用回调技术特别简单。你是说在client端还要定义一个serversocket,那具体怎么用呢?在server端,已经有一个Socket和一个ServerSocket难道在client端:ServerSocket ss = new ServerSocket();
ss.accept();
然后接收server端发来的数据???
1、客户端之间通信,是客户端A 直接 向客户端B发送信息
还是客户端A 先发送到 服务器端 ,再由服务器端 发送到客户端B ?
2、客户端之间的通信,采用TCP 方式 还是UDP方式?
但是客户端之间怎么通信?
2、如果是 客户端与客户端直接连接,发送消息也没问题,(此时服务器端只是记录 那两个客户端是连接的)
但是服务器端怎么获得 客户端通信的内容?请 LZ 说明一下??另:yekai012,请读完内容再回复,随便打比方解决不了问题!
在Socket关闭的情况下,S向C主动发起请求,C必须要在特定端口进行监听。从这个角度上来说,S变为C,C变为S。
答:1、客户端A 先发送到 服务器端 ,再由服务器端 发送到客户端B
2、客户端之间的通信,采用TCP 方式客户端之间的通信我已经实现了,现在是这样:假设客户端A和B已经连上了服务器端C,我想在C的文本框里输入数据,然后选择A、B中的一个客户端把信息发出去
因为服务器端C 知道 客户端的 IP和端口,(如果不知道,怎么转发呢?)没有什么问题啊!
不知道 LZ 在 服务器端C 是怎么转发的?可能我的理解不到位,请LZ赐教!
Socket s = ss.accept();
OutputStream os = s.getOutputStream();
然后用os.write()
...
话说CSDN的回复如果能加图片就好了...我这有个图,看了一目了然
可以把图片发到我的邮箱吗?
感激不尽!
[email protected]
你采用的是长连接方式,当客户端比较多的时候,对服务器的压力挺大,对网络的稳定性要求较高,而且Client要定时检查连接,以便进行连接恢复。
长连接适用在频繁发送数据,而且客户端较少的情况下。
具体如下:1 在服务器端写一个内部类
class ToClient implements Runnable {
private Socket s;
private DataOutputStream dos = null;
private boolean start = false;
public ToClient(Socket s) {
this.s = s;
try {
dos = new DataOutputStream(s.getOutputStream());
start = true;
} catch (IOException e) {
e.printStackTrace();
}
}
public void send(String str){
try {
dos.writeUTF(str);
} catch (SocketException e){
clients.remove(this);
jTextArea1.append("a client remove!\n");
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
while(start) {
String str = jTextArea2.getText();
for(int i=0;i<clients.size();i++){
Client c = clients.get(i);
c.send(str);
}
try {
if(dos!=null)dos.close();
if(s != null) s.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}2、点击服务器端发送按钮后启动这个线程
ToClient tc = new ToClient(s);
new Thread(tc).start();3、在客户端也有一个接受信息的线程类,在界面初始化的时候就启动
class RecvThread implements Runnable{ public void run() {
try {
while(connect){
dis = new DataInputStream(s.getInputStream());
String str = dis.readUTF();
jTextArea2.append(str+"\n");
}
}catch(SocketException e){
jTextArea2.append("退出\n");
}catch (IOException e) {
e.printStackTrace();
}
}
}
现在的问题是:
客户端之间的通信是没有问题的,即所有连接的客户端发送的信息都可以在服务器端显示,也可以由服务器端转发(转发用的不是上面的那个线程)到所有连接的客户端那里但是如果在服务器端的文本框里写上内容,点击发送,客户端就一直不停的接受信息
就是我输入一个“1”
客户端会不停的打印“1”这是什么原因啊???刚学线程和Socket一周时间,菜鸟级水平,忘指点,谢谢!
其实连接到服务器端的客户端都保存在一个ArrayList里了
用的时候,直接根据ip和端口取出就行,没有必要在新建一个socket了当然要写一个客户端类,每连接一个客户端就实例化一个客户类,然后保存