gpt4 book ai didi

Java TCP 服务器在发送所有行时收到来自客户端的每一行

转载 作者:可可西里 更新时间:2023-11-01 02:49:34 27 4
gpt4 key购买 nike

我写了两个小的 java 程序:一个从 txt 文件发送多行数据的 TCP 客户端,以及一个接受连接并逐行接收数据的 TCP 服务器。

它可以工作,但是当传输结束并且客户端关闭套接字时,服务器会一起接收所有行。我不明白为什么,因为我在每行发送到客户端后都使用刷新,我一直认为这是为了避免这种情况。

如果我的 test.txt 文件包含数字 1 2 3 ... 10,每一个在新行中,服务器的输出是:“12345678910”,然后在新行中它在控制台中写入“null”。

服务器代码:

import java.io.*;
import java.net.*;

class ServidorTCP {

private String HOST;
static final int PUERTO = 20001;

public ServidorTCP( ) {
try{
ServerSocket skServidor = new ServerSocket(PUERTO);
Socket skCliente = skServidor.accept();
DataInputStream inFromClient = new DataInputStream(new BufferedInputStream(skCliente.getInputStream()));

while(true){
String lineaLeida = inFromClient.readUTF();
if(lineaLeida.equals("END")) break;
System.out.println(lineaLeida);
}
inFromClient.close();
skCliente.close();
skServidor.close();
System.out.println( "Transmission ended" );
} catch( Exception e ) {
System.out.println( e.getMessage() );
}
}


public static void main( String[] arg ) {
new ServidorTCP();
}

}

客户端代码:

import java.io.*;
import java.net.*;

class ClienteTCP {

static final String HOST = "192.168.1.201";
static final int PUERTO = 20001;

public ClienteTCP( ) {
try{
Socket skCliente = new Socket(HOST, PUERTO);
if(skCliente.isConnected()) System.out.println("Connected!");
DataOutputStream outToServer = new DataOutputStream(skCliente.getOutputStream());

File testFile = new File("test.txt");
BufferedReader input = new BufferedReader(new FileReader(testFile));
String line;
while((line=input.readLine())!=null) {
if(!line.endsWith("\n")) line = line + "\n";
System.out.println("Sending: " + line);
outToServer.writeBytes(line);
outToServer.flush();
Thread.currentThread().sleep(1000);
}
outToServer.writeBytes("END");
input.close();
outToServer.close();
skCliente.close();
} catch( Exception e ) {
System.out.println( e.getMessage() );
}
}


public static void main( String[] arg ) {
new ClienteTCP();
}

}

问题出在哪里?

编辑:我已经按照建议编辑了代码。现在没有收到任何东西

最佳答案

事实是您的代码根本不起作用,更不用说套接字关闭之前或之后了。您正在使用 writeUTF() 写入并使用 readLine() 读取。这不起作用。你需要:




  1. 使用DataOutputStream.writeUTF()写入,使用DataInputStream.readUTF()读取


  2. 使用 println()(由多个 I/O 类提供)或 write()print() 写入(由几个 I/O 类提供),后跟 BufferedWriter.newline(),或


  3. 使用 ObjectOutputStream.writeObject() 写入,使用 ObjectInputStream.readObject() 读取。




等等。使用一个 API 写入并使用非对称 API 读取是行不通的。








关于Java TCP 服务器在发送所有行时收到来自客户端的每一行,我们在Stack Overflow上找到一个类似的问题:

https://stackoverflow.com/questions/11243155/




27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com