我最近尝试创建一个可以连接多个客户端的套接字服务器......我太懒了,不能为客户端编写单独的程序,所以我只是使用telnet。
我第一次连接(使用telnet),它工作正常......但第二个telnet连接只是挂起而cmd屏幕变为空白... 发送字符串后,即使第一个连接也被挂起。
感谢任何帮助
以下是代码:
如果有人能纠正代码中的错误并将其发布,我真的很感激
如果您愿意,可以查看它,但如果您只是点击超链接并查看图像可能会更容易:
package chatserver;
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
class Chat extends Thread {
@Override
public void run() {
Chat server = new Chat();
try {
server.SERVER();
} catch (Exception ex) {
Logger.getLogger(Chat.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void SERVER() throws Exception {
ServerSocket SRVSOCK = new ServerSocket(8068);
Socket SOCK = SRVSOCK.accept();
InputStreamReader IR = new InputStreamReader(SOCK.getInputStream());
BufferedReader BR = new BufferedReader(IR);
PrintStream PS = new PrintStream(SOCK.getOutputStream());
PS.println("What is your name: ");
String name = BR.readLine();
String Message = BR.readLine();
PS.println(name + " : " + Message);
}
}
public class ChatServer {
public static void main(String[] args) {
Chat c1 = new Chat();
Chat c2 = new Chat();
while (true) {
c1.start();
c2.start();
}
}
}
球员, 今天我在python中键入了相同的代码,因为我比使用Java更熟悉它
我已成功连接到多个客户端但无法查看来自chat()的输出... 我想知道我在下面的代码中犯了什么错误,如果有人帮助我将其转录为Java,我将非常感激:
#!/usr/bin/env python3
import socket
import threading
import time
clients = []
addr = []
HOST = '127.0.0.1'
PORT = 8068
client_no = 0
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
print('Socket bind complete')
def connect(clnt_no):
while True:
s.listen(1)
print('searching for clients')
clnt, adr = s.accept()
clients.append(clnt)
addr.append(adr)
print('connected to: ',addr[clnt_no])
# print(len(clients))
clnt_no += 1
client_no = clnt_no
def chat():
while True:
for x in range(0, client_no):
data = clients[x] = recv(1204)
if data:
for y in range(0, client_no):
clients[y].send('from client ', x, ' ', data)
else:
print('no data recieved from any client')
def Main():
conn = threading.Thread(target=connect, args=[0])
cht = threading.Thread(target=chat)
# while True:
conn.start()
cht.start()
if(__name__ == '__main__'):
Main()
提前致谢
答案 0 :(得分:1)
两个问题:
首先,Chat
的每个实例都在监听端口8068.您只能在一个特定端口上监听一个ServerSocket,尽管它可以免费accept()
个多个连接。如果你注意到你得到的例外情况而不是忽略它们,你会看到一个例外情况通知你。
其次,由于Thread的start()
方法立即返回而不是等待线程完成,因此while
循环创建了数百个(如果不是数千个)线程。你的系统没有被它们淹没的唯一原因是因为,正如我上面提到的,除了第一个实例之外的所有实例都立即无法绑定它们的ServerSockets,因此它们返回得相当快。
总之,您需要使用 one ServerSocket创建一个服务器。您需要在循环内调用accept()
,但不能创建多个ServerSocket。