Printwriter不发送给rasberry pi,即使使用了该功能插座关闭在客户端sid上

2024-05-20 18:21:36 发布

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

感谢那些曾经帮助过我的人,但我仍然有一个问题。当我使用python客户机发送数据时,与java客户机相比,使用python客户机,serveur在套接字关闭之前不会接收数据,当客户机与公共ip连接,serveur使用rasberry pi时,就是这种情况。那么为什么serveur在我关闭客户端的套接字之后使用java代码serveur仍然在等待一些数据而不是关闭线程并停止等待数据呢?

与公共ip连接的java代码


    sock = new Socket( "83.201.34.230", 1555);

                                        PrintWriter printWriter = new PrintWriter(new PrintStream(sock.getOutputStream()));






                                        String str = "This is a test String";
                                        // converting to byte[]
                                        try {

                                            //sprintWriter.write( 1234 );
                                            printWriter.write( "hello\r\n\b" );
                                            printWriter.flush();
                                            printWriter.close();


                                            System.out.println(printWriter.checkError());
                                            System.out.println( "catch error PR1234" );
                                        }catch (Exception e){
                                            System.out.println( e );
                                            System.out.println( "catch error 1234" );
                                        }












                                        System.out.println( sock.isConnected());
                                        System.out.println("socket open");
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }





                                }

    ```

python服务器

# coding: utf-8

import socket
import threading
import time
class ClientThread(threading.Thread):

    def __init__(self, ip, port, clientsocket, tcpsock):

        threading.Thread.__init__(self)
        self.tcpsock=tcpsock
        self.ip = ip
        self.port = port
        self.clientsocket = clientsocket
        print("[+] Nouveau thread pour %s %s" % (self.ip, self.port, ))

    def run(self):

        print("Connexion de %s %s" % (self.ip, self.port, ))
        print("staart fonction recv")
        r = self.clientsocket.recv(2048)
        print("Ouverture du fichier: ", r, "...")


        self.clientsocket.close()
        self.tcpsock.close()
        print("Client déconnecté...")

tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpsock.bind(("",1555))


tcpsock.listen(10)
print( "En écoute...")
(clientsocket, (ip, port)) = tcpsock.accept()
newthread = ClientThread(ip, port, clientsocket, tcpsock)
newthread.start()
time.sleep(4)
print("close socket")
tcpsock.close()

python客户端

# coding: utf-8

import socket

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

socket.connect(("91.58.70.106", 1555))

user_tab=input("what do you whant to send?")
data=(str(user_tab))
print(data)
data = data.encode("utf-8")
socket.sendall(data)

print("send all")

socket.close()

有人能告诉我一个类似python shutdown的函数,使客户机能够像python中通常那样关闭serveur吗。你知道吗

结论

总之,我认为当两种语言不同时,即使使用tcp和udp,当我使用语言标识时,当客户端关闭时,他也不会自动关闭serveur。因此,如果python函数关闭时有一个java函数标识,它可能会关闭边界上的套接字。或者一种让我的rasberry pi像我的windows笔记本电脑那样的方式,它不会让插座关闭来接收数据。你知道吗

谢谢你的帮助

如果我还不清楚,这就是python客户机和java客户机之间的区别

有了python客户端,一切正常,我可以在关闭后接收数据

[+] newthread pour 90.57.70.108 50576
Connexion de 90.57.69.108 50576
 En listenning...
 start fonction receive
('Ouverture du fichier: ', 'hello', '...')
Client Disconnected...

使用java客户机,我无法在关闭后接收数据

 [+] New thread pour 90.57.69.108 50751
    Connexion de 90.57.69.108 50751
    start fonction receive

即使我阅读了这个文档https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html,我也没有发现插座关闭()在python中

我认为serveur看不到客户机套接字何时关闭或者客户机套接字何时未正确关闭,因为在python客户机上发送数据后,当我没有关闭时,它会附加什么

如果有人做了一个应用程序,他能够连接到一个服务器,我不认为我是唯一一个需要这样做,你可以请分享你使用了什么功能,或者如果你使用UDP或tcp,你的经验,我会很高兴知道。你知道吗


Tags: selfipclose客户机portsocketjavaout