线程中的 Java 套接字 - 无数据传输

标签 java multithreading sockets

我正在尝试创建服务器和客户端之间的数据传输。连接已建立,但服务器和客户端之间没有数据传输。 服务器端:

    public static void CreateServerSocket() {
    try {
        server = new ServerSocket(9999);
        t = new Thread(new SocketServer());
        t.start();
    } catch (IOException ex) {
        Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex);
    }

}

public static void closeServer() {
    try {
        server.close();
    } catch (IOException ex) {
        Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public static void sentSide(String side) {
    out.print(side);
}

@Override
public void run() {

    try {
        client = server.accept();
        out = new PrintWriter(client.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        out.print("test from server");
        while (true){
            strIn=in.readLine();
            System.out.println(strIn);
        }
    } catch (IOException ex) {
        Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex);
    }
}

客户端:

public class SocketClient implements Runnable {

static Socket client;
static Thread t;
static PrintWriter out;
static BufferedReader in;
static String strIn;

public static boolean CreateClientSocket(InetAddress ip) {
    try {
        client = new Socket(ip, 9999);
        t = new Thread(new SocketClient());
        t.start();
        return true;
    } catch (UnknownHostException ex) {
        Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex);
        return false;
    } catch (IOException ex) {
        Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex);
        return false;
    }
}

public static void closeClient() {
    try {
        client.close();
    } catch (IOException ex) {
        Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex);
    }
}

@Override
public void run() {
    try {
        out = new PrintWriter(client.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        out.print("test from client");
        while (true) {
            strIn = in.readLine();
            System.out.println(strIn);
            DialogMultiplayerStart.setSide(strIn);
        }
    } catch (IOException ex) {
        Logger.getLogger(SocketClient.class.getName()).log(Level.SEVERE, null, ex);
    }
}

问题是 out.print 没有发送数据。连接已建立,因为 CreateClientSocket 返回 true,但 out.print("test from client/server") 和 setSide 方法都不起作用。预先感谢您的帮助。

最佳答案

客户从做开始

out.print("test from client");

然后等待来自服务器的整行:

strIn = in.readLine();

服务器通过执行以下操作启动

out.print("test from server");

然后等待来自客户端的整行:

strIn = in.readLine();

因此,双方都在等待对方发送行尾:死锁。

更改为

out.println("test from server");

out.println("test from client");

走得更远一点。但是你会遇到另一个问题:双方都在无限循环中读取,并且不再发送任何内容。

关于线程中的 Java 套接字 - 无数据传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17908860/

相关文章:

c - 服务器程序卡在 read() 函数上,但 write() 函数在客户端程序中运行良好

node.js - Nodejs 通过套接字作为请求/响应服务器的客户端

java - 按值快速查找键而不创建反向 HashMap ?

c++ - 从多个线程调用 std::shuffle

python - 如何在Python的main函数中处理从线程函数返回的数据

c - tar_fdopen 以及以前使用过的文件描述符

java - java中动态更新JSON文档

java - 使用java ConcurrentSkipListSet add方法时线程卡住

java - 如何使用哈希码作为其值来设置索引列?

c# - Azure Functions - 在另一个线程中运行长时间操作