我写了两个小的java程序:一个TCP客户端,它从一个txt文件发送许多行数据,一个TCP服务器接受连接并逐行接收。
它可以工作,但是当传输结束并且客户端关闭套接字时,服务器会一起接收所有线路。我不明白为什么,因为我在每一行发送到客户端之后都使用了flush,我一直认为这是为了避免这种情况。
如果我的test.txt文件内容为数字1 2 3 ... 10,每一行都在新行中,Server的输出为:“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();
}
}
问题出在哪里?
编辑:我已根据建议编辑了代码。现在没有收到任何感谢
答案 0 :(得分:2)
事实是你的代码根本不起作用,更不用说套接字关闭之前或之后了。您正在撰写writeUTF()
并使用readLine().
阅读这不起作用。你需要:
使用DataOutputStream.writeUTF()
撰写并使用DataInputStream.readUTF()
使用println()
(由多个I / O类提供)或write()
或print()
(由多个I / O类提供),然后是{{1 },或
使用BufferedWriter.newline()
撰写,并使用ObjectOutputStream.writeObject()
阅读。
等。使用一个API编写并使用非对称API进行读取并不起作用。
答案 1 :(得分:0)
问题不在于阅读或写作(或至少没有明确说明)。问题是你的字符串。 input.readLine()
删除end of line
,这意味着您发送的字符串只是数字。在服务器端,您会收到很多字符串,但是inFromClient.readLine()
等待直到它获得end of line
,它永远不会到达,直到流关闭并发送end of file
。
只需在您发送的每个字符串中添加end of line
即可。