//第一个服务器的代码
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。。谢谢各位大神!!