1、在用swing写一个能够动态添加客户端的socket通信程序,即服务端用
一个异步线程持续监听新的客户端连接,如果有新的连接就新建一个客户端线
程来监听客户端,接收或者发送给客户端信息。
//这是监听客户端连接的线程:
new Thread(new Runnable() {
@Override
public void run() {
// 异步线程持续监听端口连接
while (true){
if (server.isClosed()){
// 服务器一旦关闭,就跳出循环
break;
}
Socket temp = null;
try {
temp = server.accept();
JOptionPane.showMessageDialog(null,"连接建立成功,客户端端口号为:" +temp.getPort());
// 为每一个连接建立一个异步线程
Connection con = new Connection(temp);
con.start();
connections.add(con);
sockets.add(temp);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}).start();
这是客户端线程类:
class Connection extends Thread{
Socket socket;
BufferedReader reader;
PrintWriter writer;
public Connection(Socket socket){
this.socket = socket;
}
@Override
public void run() {
System.out.println("来了!");
try {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream());
// 第一次连接,先写出已经存在的联系人
writer.println("还没有联系人");
// 再读取新建联系人的名字
String clientName = reader.readLine();
System.out.println("客户端名字:" +clientName);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
/* while (true){
try {
if (socket.isConnected() == false){
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}*/
}
}
这是客户端启动时执行的方法:
@Override
public void windowOpened(WindowEvent e) {
// 窗口打开就建立连接
try {
socket = new Socket("localhost",3030);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream());
} catch (IOException ex) {
JOptionPane.showMessageDialog(null,"服务器未开启,不能连接,请关闭此客户端!");
}
/* 连接一旦建立需要立刻执行的事情
* 1、向服务器发送该客户端的名字
* 2、获取其他已经存在的客户端名字
* */
try {
System.out.println(reader.readLine());
writer.println(clientName);
} catch (IOException ex) {
ex.printStackTrace();
}
}
每次一到这个windowOpen方法的System.out.println(reader.readLine());这里就卡死,没有报错,直接卡住。
看了网上说什么readline()会因为没读到数据阻塞,所以猜想是服务端发送数据时一直没有发出来,不过没有找到解决办法,这是卡住时的情况截图