我编的是一个有界面的client端和server端,用的是线程池来处理client的连接的~~现在的问题是,我想在多个client连接进来后,server端发消息给指定的client
小妹初学java,经验也不多,
我能想到的方法是通过指定client的ip和端口来指定特定的client下面代码是按下“发送”键之后的响应事件:Java code
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//按下“发送”键 , 首先需要在服务器端 显示信息,再发送到客户端
DataOutputStream dos=null;
Socket clientsocket=null;
for(int i = 0;i < clientvector.size();i++){
if((jTextField2.getText().equals(clientvector.elementAt(i).getInetAddress()))&&(Integer.parseInt(jTextField3.getText())==(clientvector.elementAt(i).getPort())))
{
clientsocket=clientvector.elementAt(i);
}
}
if(clientsocket==null){
System.out.println("无法找到您想要连接的客户端。");
}
try {
dos = new DataOutputStream(clientsocket.getOutputStream());
} catch (IOException e1) {
e1.printStackTrace();
}
jTextArea2.append("服务器端说:"+jTextField1.getText()+"\n");//在server显示要发送到client的信息
try {
dos.writeUTF("服务器端说:"+jTextField1.getText()+"\n");
} catch (IOException e) {
e.printStackTrace();
}
try {
jTextArea2.append("dos关闭\n");
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
jTextField1.setText("");
}我现在的问题是我每按一次"发送", client端socket就关闭,serversocket也关闭了我该不该为每一次"发送"事件都创建一个dataoutputstream呢?? 实在是不知道怎么办了,希望大家帮帮忙啊!
小妹初学java,经验也不多,
我能想到的方法是通过指定client的ip和端口来指定特定的client下面代码是按下“发送”键之后的响应事件:Java code
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//按下“发送”键 , 首先需要在服务器端 显示信息,再发送到客户端
DataOutputStream dos=null;
Socket clientsocket=null;
for(int i = 0;i < clientvector.size();i++){
if((jTextField2.getText().equals(clientvector.elementAt(i).getInetAddress()))&&(Integer.parseInt(jTextField3.getText())==(clientvector.elementAt(i).getPort())))
{
clientsocket=clientvector.elementAt(i);
}
}
if(clientsocket==null){
System.out.println("无法找到您想要连接的客户端。");
}
try {
dos = new DataOutputStream(clientsocket.getOutputStream());
} catch (IOException e1) {
e1.printStackTrace();
}
jTextArea2.append("服务器端说:"+jTextField1.getText()+"\n");//在server显示要发送到client的信息
try {
dos.writeUTF("服务器端说:"+jTextField1.getText()+"\n");
} catch (IOException e) {
e.printStackTrace();
}
try {
jTextArea2.append("dos关闭\n");
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
jTextField1.setText("");
}我现在的问题是我每按一次"发送", client端socket就关闭,serversocket也关闭了我该不该为每一次"发送"事件都创建一个dataoutputstream呢?? 实在是不知道怎么办了,希望大家帮帮忙啊!
然后在这个线程和Client里都有一个while循环,这样才能一直监听,而不会关闭
那么在客户端建立连接的时候就往server端发送一些
具有标识性字符串,这些字符串标识这每个client端的编号和它的输出流标号,并将他们一起放到一个map里面,这样每个client都对应自己的输出流,如此你在server端点击发送是只需遍历这个map就能拿到所有的client和起对应的输出流,并向每个输出流写相同的字符,那么每个client端都能收到server的消息了,这样做还有个好处就是,事实上client端的IP随时都可能在变化,而监听client端的IP会很麻烦,并且你上面做的一个IP对应一个端口,当client连接的数量很多时,server不得不开很多的端口,这样server端的负荷很大,我以上说的办法只是在一个端口监听client的连接而无需关心IP,当有一个client连接的请求到达时server就为其开一个线程为其服务,;
你所说的 当我按下server端的"发送"按钮后 应该触发什么样的事件???
如果按我的方法就只需遍历这个map集合,把client号作为key找到它的输出流向李曼写就可以了
ServerThread 服务器连接监听类
ServerClientThread 服务器端数据处理类客户端:
ClientThread 客户端数据处理类在ServerThread中要统一管理ServerClientThread,点击按钮以后,由ServerThread遍历式调用ServerClientThread的消息发送函数