(我有以下代码,它们想要实现服务器端应用程序并向客户端发送响应:
>#r "C:\Users\...\Project.dll"
>using System;
>using System.Reflection;
>Assembly assembly = >Assembly.LoadFrom("C:\Users\...\Project.dll");
> Object mc = assembly.CreateInstance("AccessInternal.MyClass");
> Type t = mc.GetType();
> BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic;
> MethodInfo mi = t.GetMethod("MyMethod", bf);
> string result = (string)mi.Invoke(mc, null);
> Console.WriteLine(result);
Hello world!
>
现在我写一个简单的客户端:
class client(Thread):
def __init__(self, socket, address):
Thread.__init__(self)
self.sock = socket
self.addr = address
self.start()
def run(self):
request=''
while 1:
data=self.sock.recv(1024).decode() #the program hangs here with large message
if not data:
break
request+=data
print(request, self.addr[1], self.addr[0]))
message = "test"
self.sock.send(message.encode())
def init_server():
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind((host, int(port)))
serversocket.listen(5)
while 1:
clients, address = serversocket.accept()
client(clients, address)
return
现在的问题是服务器挂在具有大消息的recv中。该怎么解决?
答案 0 :(得分:1)
您的客户端套接字和服务器套接字是不同的套接字。
您可以使用serversocket
对象来获取服务器信息,就像尝试self.sock
我建议将serversocket
作为第三个参数解析到您的client
类中,然后像这样在类中使用它
class client(Thread):
def __init__(self, socket, address, server):
Thread.__init__(self)
self.sock = socket
self.addr = address
self.server = server
self.start()
def run(self):
request=''
while 1:
data=self.sock.recv(1024).decode()
if not data:
break
request+=data
print(request, self.server.getsockname()[1], self.server.getsockname()[0]))
def init_server():
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind((host, int(port)))
serversocket.listen(5)
while 1:
clients, address = serversocket.accept()
client(clients, address, serversocket)
return
这应该输出服务器信息
如果您需要客户端信息,则将其作为元组解析在“地址”中,您可以看到用于进行通信的远程IP和套接字端口(不是开放端口)