我正在使用tcp编写一个简单的客户端服务器聊天应用程序。 但是消息不会被转发到客户端/服务器而是在终端中得到非常神秘的错误,就像在无限循环中一样,直到我终止进程或关闭应用程序。任何人都可以建议代码中的更改。
class UIserver extends JFrame implements ActionListener {
JTextArea textArea;
JButton sendButton;
JTextField textField;
JScrollPane scrollpane ;
DataOutputStream dos = null;
DataInputStream dis = null;
Scanner scanner = new Scanner(System.in);
public UIserver(){
this.setTitle("Server");
this.setLayout(new FlowLayout());
textArea = new JTextArea(30,50);
textArea.setBackground(Color.white);
textArea.setLayout(new FlowLayout());
scrollpane = new JScrollPane(textArea);
getContentPane().add(scrollpane, BorderLayout.CENTER);
this.add(scrollpane);
sendButton = new JButton("Send");
this.add(sendButton);
sendButton.addActionListener(this);
textField = new JTextField(30);
this.add(textField);
this.setVisible(true);
this.setSize(600,600);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}//end ctor
public void setDataOutput(DataOutputStream dos){
this.dos = dos;
}
public void setDataInput(DataInputStream dis){
this.dis = dis;
}
public void getMsg(){
new Thread(new Runnable(){
public void run (){
while(true){
try {
String msg = dis.readUTF();
textArea.append("From Client :- "+msg+"\n");
}catch(Exception e){e.printStackTrace();}
}//end while
}
}).start();
}//end getmsg
public void actionPerformed(ActionEvent e) {
if (e.getSource() == sendButton) {
new Thread(new Runnable(){
public void run (){
while(true){
try{
String msgsend = scanner.nextLine();
textArea.append("To Client :- "+msgsend+"\n");
//dos.writeUTF(msgsend);
}catch(Exception e){e.printStackTrace();}
}//end while
}
}).start();
}//end if
}//end actionPerformed
这部分对于客户端和服务器都是相同的
现在主要
服务器主要方法
public static void main(String[] args) throws Exception {
UIserver usi = new UIserver();
ServerSocket socket = new ServerSocket(5000);
Socket server = socket.accept();
DataInputStream dis = new DataInputStream(server.getInputStream());
DataOutputStream dos = new DataOutputStream(server.getOutputStream());
usi.setDataInput(dis);
usi.setDataOutput(dos);
usi.getMsg();
}//end main
客户主要方法
public static void main(String[] args) throws Exception {
UIclient cli = new UIclient();
Socket socket = new Socket("localhost",5000);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream());
cli.setDataInput(dis);
cli.setDataOutput(dos);
cli.getMsg();
}//end main
答案 0 :(得分:0)
就无限错误循环而言,我认为这是因为你在应用程序启动时调用你的方法getMsg()
cli.getMsg();
永远循环运行这个
while(true){
try {
String msg = dis.readUTF();
textArea.append("From Client :- "+msg+"\n");
}catch(Exception e){e.printStackTrace();}
}
while始终是真的,并且异常被捕获并且无休止地发送堆栈跟踪的垃圾邮件,可能是因为它试图获取尚不存在的消息,因为它在启动之前在任何消息存在之前运行?也许,我不确定。
尝试删除try块的catch部分,看看是否可以发送消息而不会使用堆栈跟踪发送垃圾邮件。像这样......
while(true){
try {
String msg = dis.readUTF();
textArea.append("From Client :- "+msg+"\n");
}
finally{}
}
这不是最佳做法,但有希望让你前进。