Java 客户端停止对服务器的响应';s消息
我面临一个新问题。 我正在用Java+Swing编写一个messenger,我选择了这种方式与服务器进行客户端对话: 我有类正在运行(所有代码都是为客户机编写的) (服务器正常-我已检查) } 主要是我做了一个变量Java 客户端停止对服务器的响应';s消息,java,swing,sockets,concurrency,timer,Java,Swing,Sockets,Concurrency,Timer,我面临一个新问题。 我正在用Java+Swing编写一个messenger,我选择了这种方式与服务器进行客户端对话: 我有类正在运行(所有代码都是为客户机编写的) (服务器正常-我已检查) } 主要是我做了一个变量 run = new Running(); 然后我将这个变量发送到所有地方,它似乎都能工作。 它通过插槽提供读线或写线。 我可以注册用户、登录或添加联系人 我可以打开MessageFrame向联系人发送消息。 但当我关闭它时,我的程序会停止对服务器消息的正确反应。 它只对30-7
run = new Running();
然后我将这个变量发送到所有地方,它似乎都能工作。
它通过插槽提供读线或写线。
我可以注册用户、登录或添加联系人
我可以打开MessageFrame向联系人发送消息。
但当我关闭它时,我的程序会停止对服务器消息的正确反应。
它只对30-70%的消息作出反应。
我检查了-服务器正常。
因此,问题在于运行或MessageFrameListener
public class MessageFrameListener{
private MessageFrame mf;
private User us;
private Contact cn;
private Timer timer;
private Running run;
public MessageFrameListener(MessageFrame m_f, User u_s, Contact c_n, Running r_n){
run = r_n;
mf = m_f;
us = u_s;
cn = c_n;
m_f.addButtonListener(new SButtonListener());
m_f.addWinListener(new FrameListener());
timer = new Timer(500,new timerListener());
timer.start();
}
public class timerListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
SwingWorker<String,Void> sw = new SwingWorker<String,Void>(){
public String doInBackground() {
String ret = "";
ret = run.receiveLine();
return ret;
}
public void done() {
String[] results = null;
try {
results = get().split(" ");
} catch (InterruptedException
| ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if("m".equals(results[0])){
if("-1".equals(results[2]))
mf.addLine2("Error");
else{
mf.addLine2(results[3]);
}
}
}
};
sw.execute();
}
}
public class SButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
String insert = mf.getInput();
if(!insert.equals("")){
String infoString = "m "+us.getName()+" "+cn.getName()+" "+insert;
run.sendLine(infoString);
mf.addLine(insert);
mf.refreshInput();
}
}
}
public class FrameListener implements WindowListener{
@Override
public void windowClosing(WindowEvent e) {
timer.stop();
timer = null;
mf.close();
}
但是什么也没发生!Swing不添加新行
addLine2的代码:
public void addLine2(String line){
//dialogArea.append(line+"\n");
try {
if(line != ""){
String formLine = us.getName()+" ("+now()+")\n";
doc.insertString(doc.getLength(), formLine+line+"\n",st2);
}
}
catch (BadLocationException e){
e.printStackTrace();
}
}
当然行="";
可能是线程的一些摆动问题?Swing不能处理我的请求
Vasily.这可能是因为readLine方法希望该行以\n结尾。尝试让服务器发送消息,并在消息结尾添加一个\n,这可能是因为readLine方法希望该行以一个\n结尾。尝试让服务器发送消息,并在消息末尾添加一个\n嘿,他说的是对的,该字符串将与/n匹配,但它正在尝试获取
in that just try with **While** condition , that till true get the string .
这是样品
try {
while(true) {
DataInputStream is = new DataInputStream(sock.getInputStream());
System.out.println("" +is.readLine());
line =is.readLine();
} // end of while
} catch(Exception ex) {}
}
嘿,他所说的是对的,字符串将与/n绑定,但它正在尝试获取
in that just try with **While** condition , that till true get the string .
这是样品
try {
while(true) {
DataInputStream is = new DataInputStream(sock.getInputStream());
System.out.println("" +is.readLine());
line =is.readLine();
} // end of while
} catch(Exception ex) {}
}
在我看来,问题在于这一行,您的PrintStream未设置为自动刷新,因此请尝试更改这一行:
ps = new PrintStream(s.getOutputStream());
对此
ps = new PrintStream(s.getOutputStream(), true);
因此,它不会将输入存储到缓冲区,而是自动将其清除。有关更多信息在我看来,问题在于这一行,您的PrintStream未设置为自动刷新,因此请尝试更改这一行:
ps = new PrintStream(s.getOutputStream());
对此
ps = new PrintStream(s.getOutputStream(), true);
因此,它不会将输入存储到缓冲区,而是自动将其清除。有关更多信息,请参见服务器发送消息outputStream.println(“某些字符串”);因此,它们似乎以\n结尾,因为printlntry制作了一个带有main的小测试类,如下所示:for(;;)running.receiveLine()如果它不起作用,请查看代码在clientIt中的停止位置它不会有帮助。我可以在第一次打开消息框时发送2或2000条消息,一切正常。但是当我关闭它并再次打开时,我只收到50%的消息。这可能是服务器的问题。如果您无法识别错误,请尝试使用wireshark之类的工具,查看流量是否确实是由服务器发送的,以及消息是否正是您所期望的关于问题的新的有趣信息(来自调试)!查看我的问题服务器发送消息outputStream.println(“一些字符串”);因此,它们似乎以\n结尾,因为printlntry制作了一个带有main的小测试类,如下所示:for(;;)running.receiveLine()如果它不起作用,请查看代码在clientIt中的停止位置它不会有帮助。我可以在第一次打开消息框时发送2或2000条消息,一切正常。但是当我关闭它并再次打开时,我只收到50%的消息。这可能是服务器的问题。如果您无法识别错误,请尝试使用wireshark之类的工具,查看流量是否确实是由服务器发送的,以及消息是否正是您所期望的关于问题的新的有趣信息(来自调试)!请参阅我问题的底部有关该问题的新的有趣信息(来自调试)!请参阅我问题的底部有关该问题的新的有趣信息(来自调试)!查看我问题的底部1)将你的问题拆分为两个三个分开的问题2)在这个论坛上搜索,我可以在这里找到一些关于Swing和Socket以及SwingWorker/Runnable#Thread1)将你的问题拆分为两个三个分开的问题2)在这个论坛上搜索,我可以在这里找到一些关于Swing和Socket以及SwingWorker/Runnable#Thread的非常相互关联的代码