求问,在一个线程里为什么另一个线程不运行啊(关于socket)

sinat_34691996 2016-08-21 05:34:01

//第一个服务器的代码
public class Server extends JFrame implements Runnable{

public static JTextArea display = new JTextArea();
public static List<Socket> socketList = new ArrayList<Socket>();

public Server(){
super("服务端");

display.setLineWrap(true);//自动换行
display.setEditable(false);//不可编辑
JScrollPane scrollPane = new JScrollPane(display);
add(scrollPane,BorderLayout.CENTER);

setSize(240,320);
setResizable(false);
this.setLocation((int)(ToolkitUtil.TollkitUtil().width)/2-600, (int)(ToolkitUtil.TollkitUtil().height-400)/2);
//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

//菜单栏
//操作菜单
JMenu opMenu = new JMenu("操作");
JMenuItem serverItem = new JMenuItem("打开客户端");
JMenuItem exitItem = new JMenuItem("退出服务端");
opMenu.add(serverItem);
opMenu.add(exitItem);
//加入菜单栏
JMenuBar menubar = new JMenuBar();
menubar.add(opMenu);
setJMenuBar(menubar);

// //为打开客户端添加监听
// serverItem.addActionListener(new ActionListener() {
//
// @Override
// public void actionPerformed(ActionEvent e) {
// // TODO Auto-generated method stub
// new SocketFrame().connect();;
//
// }
// });

//为退出添加监听
exitItem.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Server.this.dispose();

}
});


}

//启动Socket服务
public void run(){
try {
ServerSocket serverSocket = new ServerSocket(151);
display.setText("服务启动成功!\n");

while(true){
Socket socket = serverSocket.accept();
String ipAddress = socket.getInetAddress().getHostAddress();
display.append("用户"+ipAddress+"已经接入服务器...\n");

socketList.add(socket);
new ReadMsgThreadServer(socket).start();
}

} catch (IOException e) {
display.setText("服务端启动失败!\n");
}
}





}

//第二个是读内容的代码

//该线程主要用来读取socket发送过来消息
public class ReadMsgThreadServer extends Thread {

private Socket socket;

public ReadMsgThreadServer(Socket socket){
this.socket = socket;
}

@Override
public void run() {
try {
DataInputStream dis = new DataInputStream(socket.getInputStream());
while(true){
String msg = dis.readUTF();
for(Socket socket:Server.socketList){
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeUTF(msg);
dos.flush();
}
}
} catch (IOException e) {
Server.display.append(socket.getInetAddress().getHostAddress()+"已退出...");
}

}


}

//客户端主要也用了线程(因为这是在一个主界面里,不加就卡死了QAQ),这是线程里的子线程
@Override
public void run() {
// TODO Auto-generated method stub
try {
Socket socket = new Socket("172.22.248.121",151);
dos = new DataOutputStream(socket.getOutputStream());
dis = new DataInputStream(socket.getInputStream());
new ReadMsgThreadClient(dis).start();

} catch (UnknownHostException e) {
msgDisplay.setText("连接失败,请确认服务器地址正确!\n");
} catch (IOException e) {
msgDisplay.setText("连接失败,请确认端口正确!\n");
}
}

class ReadMsgThreadClient extends Thread{
private DataInputStream dis;
public ReadMsgThreadClient(DataInputStream dis){
this.dis = dis;
}

public void run(){
while(true){
try {
String msg = dis.readUTF();
msgDisplay.append(msg+"\t\t"+sdf.format(new Date())+"\n");

} catch (IOException e) {
e.printStackTrace();
}
}
}
}




一共用了四个线程,客户端和服务端用了,然后里面读写也用了。。然后那个中间的那个 ReadMsgThreadServer不运行,然后客户端报空指针,服务端不显示退出。。。代码很长QAQ。。谢谢各位大神!!
...全文
350 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
skgary 2016-08-22
  • 打赏
  • 举报
回复
ReadMsgThreadServer 的run 方法写的有问题啊。 应该是一个线程处理一个socket的数据,而不是run里面再去读所有的socket的数据 。
sinat_34691996 2016-08-21
  • 打赏
  • 举报
回复
引用 1 楼 zxcvvcxz8765 的回复:
这个accept是一种阻塞形式的IO和监听端口方法。 如果有数据过来会唤醒此方法,内部用的wait()、notity()
_(:зゝ∠)_。就是唤不醒它啊。。我给了数据,它没有进去那个服务器读的线程里,然后再客户端就报空指针了。
zxcvvcxz8765 2016-08-21
  • 打赏
  • 举报
回复
这个accept是一种阻塞形式的IO和监听端口方法。 如果有数据过来会唤醒此方法,内部用的wait()、notity()

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧