好的,我知道这里有很多类似的问题,但我无法通过它们找出问题。所以我必须发布这个。对于那些家伙。这是我的问题...我做了一个聊天服务器,几天前在netbeans控制台上工作,输出正常。但现在我正在使用Jframes。但是,当我点击一个客户端框架上的发送按钮时,按钮冻结,没有任何反应。该消息不会转到第二个客户端的另一帧。
这是我的客户端代码。我已经在客户端类中创建了线程类。我不知道这是否会产生问题。
public class chat extends javax.swing.JFrame {
Socket socket;
DataOutputStream dos ;
chat() {
initComponents();
}
private void sendActionPerformed(java.awt.event.ActionEvent evt) {
try{
dos = new DataOutputStream(socket.getOutputStream());
String data ="";
data = msg.getText();
do{
dos.writeUTF(msg.getText());
dos.flush();
}
while(data!= "stop");
}
catch(Exception e)
{
JOptionPane.showMessageDialog(this, e, "Error @ Cthread1", JOptionPane.ERROR_MESSAGE);
}
finally{
try{
dos.close();
}
catch(Exception e)
{
JOptionPane.showMessageDialog(this,e,"Error @Finally of Cthread1",JOptionPane.ERROR_MESSAGE);
}
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
try{
chat n = new chat();
n.run();
n.setVisible(true);
}catch(Exception e){
JOptionPane.showMessageDialog(null,e,"main",JOptionPane.ERROR_MESSAGE);
}
}
});
}
private javax.swing.JLabel jLabel1;
public javax.swing.JTextField msg;
private javax.swing.JButton send;
public void run()
{
try{
socket = new Socket("127.0.0.1", 1036);
dos = new DataOutputStream(socket.getOutputStream());
Cthread2 thread2 = new Cthread2(socket);
thread2.start();
}
catch(Exception e){
JOptionPane.showMessageDialog(null, e,"Error @ MAin run", JOptionPane.ERROR_MESSAGE);
}
}
class Cthread2 extends Thread{
Socket socket;
Cthread2(Socket socket) {
this.socket = socket;
}
public void run() {
try {
String fromServer ="";
while(fromServer != "stop")
{
DataInputStream sr = new DataInputStream(socket.getInputStream());
fromServer = sr.readUTF();
msg.setText(fromServer);
}
} catch (IOException e) {
JOptionPane.showMessageDialog(null,e,"Error @ Cthread2", JOptionPane.ERROR_MESSAGE);
}
}
}
}
这是我的服务器类
public class Multiserver {
ServerSocket serversocket;
Socket socket;
ArrayList<Socket> al = new ArrayList<Socket>();
DataInputStream dis;
DataOutputStream dos;
Multiserver() throws IOException
{
serversocket = new ServerSocket(1036);
//JOptionPane.showMessageDialog(null,"Server Started on port 1036","Info !", JOptionPane.ERROR_MESSAGE);
System.out.println("Server Started on port 1036");
while(true)
{
socket = serversocket.accept();
System.out.println(socket);
al.add(socket);
Pthread thread = new Pthread(socket, al);
thread.start();
}
这是服务器线程
public class Pthread extends Thread {
DataInputStream dis;
DataOutputStream dos;
ArrayList al;
Socket socket;
Pthread(Socket socket, ArrayList al)
{
this.al = al;
this.socket = socket;
}
public void run()
{
try{
String data =new chat().msg.getText();
dis = new DataInputStream(socket.getInputStream());
while(data != null)
{
data = dis.readUTF();
if(data != "stop")
broadcast(data);
else
{
dos = new DataOutputStream(socket.getOutputStream());
dos.writeUTF(data);
dos.flush();
}
}
}
catch(Exception e){
JOptionPane.showMessageDialog(null,e,"Error @run",JOptionPane.ERROR_MESSAGE);
}
}
public void broadcast(String data )
{
try{
Iterator it = al.iterator();
while(it.hasNext())
{
Socket socket1 = (Socket)it.next();
dos = new DataOutputStream(socket1.getOutputStream());
dos.writeUTF(data);
dos.flush();
}
}
catch(Exception e){
JOptionPane.showMessageDialog(null, e,"Error @ broadcast",JOptionPane.ERROR_MESSAGE);
}
}
}
我试着找出问题所在,但我似乎无法得到它。当我试图在我的脑海里运行程序来理解它时,我陷入困境。令人沮丧。感谢任何能帮助我解决问题的人。是的我试图将以前在控制台上工作的程序更改为使用框架的程序。
答案 0 :(得分:2)
data = msg.getText();
do{
dos.writeUTF(msg.getText());
dos.flush();
}
while(data!= "stop");
=如果第一个getText
没有返回&#34;停止&#34; <无效循环。
如果您真的想以这种方式执行此操作,则必须在循环内更新data
,以便根据当前条目进行评估。但即使这样也不行。您将充斥服务器,因为您不会等到msg文本发送前发生更改。因此,如果msg包含&#34; hello&#34;,这将向您的服务器发送很多问候,然后才能写出&#34; stop&#34; ...
为什么不一次发送一行( - &gt;这里没有循环)?
此外,您无法将字符串值与==或!=进行比较,请使用String.equals
。请参阅this关于该主题的高评价答案。
另外,在安德鲁如此真实地提及的情况下,不要在美国东部时间做网络活动。