java - 聊天程序使用TCP : Only first message reaches other end

标签 java swing tcp

我正在编写一个 TCP 聊天程序。

这是我的输出。 正如您所看到的,只有来自每个对等方的第一条消息到达另一端。 病房上的第二条消息不显示。 enter image description here

这是我的完整代码。你可以运行它。我哪里错了?

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;

class chattcp extends JFrame {
    public static void main(String args[]){
        chattcp peer1=new chattcp("peer1",9999,9998);
        chattcp peer2=new chattcp("peer2",9998,9999);       
    }

    chattcp(String name,int lis,int snd){
        this.setVisible(true);
        this.setTitle(name);
        this.setLayout(null);
        this.setSize(500,500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        TextField tf=new TextField();
        this.add(tf);
        tf.setBounds(10,20,100,40);

        TextArea ta=new TextArea();
        this.add(ta);
        ta.setBounds(10,80,400,400);
        ta.setEditable(false);
        ta.setFont(ta.getFont().deriveFont(20f));
        Button b=new Button("send");
        this.add(b);
        b.setBounds(130,20,60,40);
        b.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent a){
                try{
                    String s= tf.getText();
                    Socket skt=new Socket("localhost",snd);
                    DataOutputStream dos= new DataOutputStream(skt.getOutputStream());
                    dos.writeUTF(s);
                    ta.append("You :"+s+"\n");
                    tf.setText("");
                }
                catch(IOException e){
                    e.printStackTrace();
                }
            }
        });

        Thread receive=new Thread() {
                    public void run(){
                      try{
                        ServerSocket ser=new ServerSocket(lis);
                        Socket sktt=ser.accept();
                        DataInputStream dis= new DataInputStream(sktt.getInputStream());
                        while (true){
                            String s= dis.readUTF();
                            ta.append("Friend : "+s+"\n");
                        }
                      }catch(IOException e){e.printStackTrace();}
                    }
                };
        receive.start();

    }
}

最佳答案

每次单击发送按钮时,都会创建一个新套接字并尝试连接。

问题是,一旦你发送了一些东西,套接字就被创建,服务器套接字接受并开始循环。

当您现在写入第二条消息时,您正在创建一个新套接字,而循环仍在尝试从旧套接字的 OutputStream 中读取数据。

您的问题的一个解决方案是在每次读取后关闭服务器套接字,并在每次迭代时创建一个新的服务器套接字:

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;

public class chattcp extends JFrame {

public static void main(String args[]) {
    chattcp peer1 = new chattcp("peer1", 9999, 9998);
    chattcp peer2 = new chattcp("peer2", 9998, 9999);
}

chattcp(String name, int lis, int snd) {
    this.setVisible(true);
    this.setTitle(name);
    this.setLayout(null);
    this.setSize(500, 500);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    TextField tf = new TextField();
    this.add(tf);
    tf.setBounds(10, 20, 100, 40);

    TextArea ta = new TextArea();
    this.add(ta);
    ta.setBounds(10, 80, 400, 400);
    ta.setEditable(false);
    ta.setFont(ta.getFont().deriveFont(20f));
    Button b = new Button("send");
    this.add(b);
    b.setBounds(130, 20, 60, 40);
    b.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent a) {
            try {
                String s = tf.getText();
                Socket skt = new Socket("localhost", snd);
                DataOutputStream dos = new DataOutputStream(skt.getOutputStream());
                dos.writeUTF(s);
                ta.append("You :" + s + "\n");
                tf.setText("");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

    Thread receive = new Thread() {
        public void run() {
            try {
                while (true) {
                    ServerSocket ser = new ServerSocket(lis);
                    Socket sktt = ser.accept();
                    DataInputStream dis = new DataInputStream(sktt.getInputStream());

                    String s = dis.readUTF();
                    ta.append("Friend : " + s + "\n");

                    ser.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
    receive.start();

}
}

一个更好的解决方案是当你发送一些东西时不要总是创建一个新的套接字,但我很懒,而且这个解决方案更容易编辑你的代码,所以我只是使用它。

关于java - 聊天程序使用TCP : Only first message reaches other end,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41504408/

相关文章:

java - 实现 Shape 接口(interface)的 boolean contains(Rectangle2D r) 方法

java - 使用哪一个(executeUpate 或 list)来插入、更新和选择?

java - 访问 Outlook 表单和 Exchange Web 服务中的自定义字段

java - 服务器应用程序挂起 Java 套接字编程

java - 对象代替界面?

java - 处理窗口的事件

java - 使用按钮启动/停止 Windows 服务

java - 如何为 JList 和 DefaultListModel 创建 setter 和 getter? ( java )

linux - 如何在 Bash 中终止 TCP 端口 16969?

Java网络对象序列化