我在写一个简单的多人聊天功能,客户端是用SWT写的
这个是客户端的文件,服务器端已经证实是没问题,
代码如下:package com.zjh;import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;import org.jdesktop.layout.GroupLayout;
import org.jdesktop.layout.LayoutStyle;public class Client extends JFrame implements Runnable{ private JTextField txtSend;
private JTextArea txtContent;
private Socket socket;
private PrintStream ps;
// private Scanner scanner;
private BufferedReader reader;
private final String host="127.0.0.1";
private final int port=9999;
boolean enable=false;
/**
 * Launch the application
 * @param args
 */
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Client frame = new Client();
frame.setVisible(true);
new Thread(frame).start();
//******************
//******************
} catch (Exception e) {
e.printStackTrace();
}
}
});
} /**
 * Create the frame
 */
public Client() {
super();
setTitle("SWT客户端");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JButton btnSend;
btnSend = new JButton();
btnSend.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent e) {
String msg=txtSend.getText();
if(msg.equals("")||msg==null) return;
// txtContent.append(msg);
synchronized (ps) {
ps.println(msg);
}
}
});
btnSend.setText("发送");
btnSend.setEnabled(false); //开始时先禁止“发送”键

txtContent = new JTextArea(); txtSend = new JTextField(); final JButton btnLink;
btnLink = new JButton();
btnLink.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent e) {
try {
socket=new Socket(host,port);
ps=new PrintStream(socket.getOutputStream());
// scanner=new Scanner(socket.getInputStream());
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
txtContent.append("成功连接到服务器!\n");
enable=true;
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
enable=false;
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
enable=false;
}
btnSend.setEnabled(enable);
btnLink.setEnabled(!enable);
}
});
btnLink.setText("连接");
final GroupLayout groupLayout = new GroupLayout((JComponent) getContentPane());
groupLayout.setHorizontalGroup(
groupLayout.createParallelGroup(GroupLayout.TRAILING)
.add(txtContent, GroupLayout.DEFAULT_SIZE, 543, Short.MAX_VALUE)
.add(groupLayout.createSequentialGroup()
.addContainerGap()
.add(btnLink)
.addPreferredGap(LayoutStyle.RELATED)
.add(txtSend, GroupLayout.PREFERRED_SIZE, 387, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.RELATED)
.add(btnSend)
.addContainerGap())
);
groupLayout.setVerticalGroup(
groupLayout.createParallelGroup(GroupLayout.TRAILING)
.add(groupLayout.createSequentialGroup()
.add(txtContent, GroupLayout.DEFAULT_SIZE, 303, Short.MAX_VALUE)
.addPreferredGap(LayoutStyle.RELATED)
.add(groupLayout.createParallelGroup(GroupLayout.BASELINE)
.add(btnSend)
.add(btnLink)
.add(txtSend, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);
getContentPane().setLayout(groupLayout);
pack();
//
} public void run() {
// TODO Auto-generated method stub
try{
while(true){
String input=reader.readLine();
String txt=txtContent.getText();
txt=txt+input+"\n";
txtContent.setText(txt);
System.out.println(input);
}
}catch (Exception e) {
// TODO: handle exception
}
}
}
目前有一个问题就是运行后,另外一个客户端发送消息时,这个客户端收不到信息,
而我用Telnet 127.0.0.1 9999方法运行telnet作为客户端时,这个Client运行发送消息时,telnet端能收到这个Client的信息
我自己做一个简单的只读Clinet2,是能正常收到的,我估计是run()方法部分有问题,但不知道问题出在哪里,
请假帮忙看看,谢谢了

解决方案 »

  1.   

    还是有些不太清楚楼主说的意思.
    Socket通信中。你绑定的地址是服务器的地址。如果想实现两个客户端之间的通信。那么我们必须知道客户端自己的IP地址及其端口号。如果你在绑定服务器的Ip地址和端口号。在没有中转的情况下另一个客户端是无法收到信息的!
      

  2.   

    我awt不熟。
    可是我看到了两个run()方法
      

  3.   

    后来我自己解决了,
    public void run() { 
    // TODO Auto-generated method stub 
    try{ 
    while(true){ 
    String input=reader.readLine(); 
    String txt=txtContent.getText(); 
    txt=txt+input+"\n"; 
    txtContent.setText(txt); 
    System.out.println(input); 

    }catch (Exception e) { 
    // TODO: handle exception 

    } 这部分应该在循环里加个if判断,if(reader==null) continue;
    否则因为一开头的话,为空就会捕获异常,导致循环终结