Python服务器没有从java clien接收完整的字符串

2024-09-30 14:38:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python服务器和一个java客户机。当一个字符串从java发送到python时,它是不完整的。示例:

Java代码发送:Helloooooooooo

在Python中接收为:

he

lloooooooo

oo

这是密码

Python服务器:

^{pr2}$

Java客户端:

package server;

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

class Reciever_test {
 public static void main(String args[]) throws Exception {
        String sentence;
        String modifiedSentence;
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
    Socket clientSocket = new Socket("localhost", 10000);
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    while(true)
    {
        sentence = inFromUser.readLine();
        outToServer.writeBytes(sentence + "\n");
        modifiedSentence = inFromServer.readLine();
        System.out.println("FROM SERVER:" + modifiedSentence);
    }

    //clientSocket.close();
}

}


Tags: import服务器newstringsocketjavasystemsentence
2条回答

Java客户端: 只是改变了发送数据到服务器的方式。在

 public static void main(String args[]) throws Exception {
    String sentence;
    String modifiedSentence;
    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
    Socket clientSocket = new Socket("localhost", 10000);
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
    Scanner sc = new Scanner(System.in);
    while(true)
    {


        while (true) {
            String input = sc.nextLine();
            out.print(input);
            out.flush();
            modifiedSentence = inFromServer.readLine();
            System.out.println("FROM SERVER:" + modifiedSentence);
        }
    }

Python服务器: 我的回应方式也必须改变(使用send而不是sendall)

^{pr2}$

Klaus D.说的话是徒劳的,recv保证最多等待多少数据,它可能决定在大小达到之前处理它所拥有的数据。我使用了一个简单的缓冲区,但我相信可能有更好的方法:

import socket
import atexit

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ("localhost", 10000)
print ('starting up on %s port %s' % server_address)
sock.bind(server_address)

sock.listen(5)

def close(connection):
    connection.close()

while True:
     print ('waiting for a connection')
     connection, client_address = sock.accept()
     atexit.register(close, connection)

     try:
         print ('connection from', client_address)

         buffer=[]
         while True:

             data = connection.recv(1024)
             for b in data:
                buffer.append(b)
             print ('received: ' + str(data))
             print (type(data))

             if str(buffer[-1]) == '\n': #if changed to use the buffer to decide when done receiving, the newline is the terminator
                 print ('sending data back to the client')
                 connection.sendall(''.join(buffer))
                 buffer = []
             # else:
             #     print ('no more data from', client_address)
             #     break

     finally:
         close(connection)

atexit是在程序崩溃时优雅地关闭套接字

相关问题 更多 >