java - 简单的java套接字和线程程序的问题

标签 java multithreading sockets

我正在尝试学习如何在 java 中使用线程和套接字。我有一个非常简单的程序。它的功能是让用户输入一个字符串,然后由套接字在线程内运行的服务器接收并打印该消息。我让它打印出“连接已建立!”并接受用户的输入,但它们似乎从未打印出来。是否有某种原因导致收到的消息没有打印到控制台?

这是客户端类:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws IOException {
        InetAddress host = InetAddress.getLocalHost();

        TCPServer newServer = new TCPServer(5001);
        Thread thread = new Thread(newServer);
        thread.start();

        Socket socket = new Socket(host,5001);
        String outgoing_message = "";
        Scanner scan = new Scanner(System.in);
        PrintWriter printer = new PrintWriter(socket.getOutputStream());
        while(!outgoing_message.equals("close")) {
            System.out.print("Enter message: ");
            outgoing_message = scan.nextLine();
            printer.println(outgoing_message);
        }
        socket.close();


    }
}

这是 TCPServer 类:

package Package_Two;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class TCPServer implements Runnable{
    private Socket socket;
    private ServerSocket serverSocket;



    public TCPServer(int port) throws IOException{
        this.serverSocket = new ServerSocket(port);
    }

    @Override
    public void run(){
        try {
            this.socket = serverSocket.accept();
            System.out.println("Connection established!");
            Scanner scan = new Scanner(socket.getInputStream());
            String incoming_message = "";
            while(!incoming_message.equals("close")){
                incoming_message = scan.nextLine();
                System.out.println("Received message: " + incoming_message);
            }
            socket.close();
        }
        catch(IOException iex){
            iex.printStackTrace();
        }


    }




}

最佳答案

如果您查看所使用的 PrintWriter 构造函数的源代码,您会发现它使用 autoFlush = false 调用另一个构造函数。

我想,你应该将其更改为:

    PrintWriter printer = new PrintWriter(socket.getOutputStream(), true);

关于java - 简单的java套接字和线程程序的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47517507/

相关文章:

java - 在 JFileChooser Java 中保存已打开的文件?

java - 缩短 AWT 异常堆栈跟踪

java - Java 中的锁是如何工作的?

python-3.x - 如何使用 python 套接字 AF_bluetooth 套接字广播蓝牙查询?

c++ - 如何检查 TCP 连接是否是本地的?

javascript - HTML5 的平台独立容器,可以从套接字发送/接收数据

Java awt Swing - 我遇到错误了吗?

java - Spring MVC ModelAttribute 作为接口(interface)

C# 如何检测一个对象是否已经被锁定

c# - 为重负载任务设置低线程优先级