Java中的多线程套接字服务器

时间:2017-03-22 11:59:45

标签: java sockets

我最近尝试创建一个可以连接多个客户端的套接字服务器......我太懒了,不能为客户端编写单独的程序,所以我只是使用telnet。

我第一次连接(使用telnet),它工作正常......但第二个telnet连接只是挂起而cmd屏幕变为空白... 发送字符串后,即使第一个连接也被挂起。

感谢任何帮助

以下是代码:

Chatserver.java

如果有人能纠正代码中的错误并将其发布,我真的很感激

如果您愿意,可以查看它,但如果您只是点击超链接并查看图像可能会更容易:

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()  

提前致谢

1 个答案:

答案 0 :(得分:1)

两个问题:

首先,Chat的每个实例都在监听端口8068.您只能在一个特定端口上监听一个ServerSocket,尽管它可以免费accept()个多个连接。如果你注意到你得到的例外情况而不是忽略它们,你会看到一个例外情况通知你。

其次,由于Thread的start()方法立即返回而不是等待线程完成,因此while循环创建了数百个(如果不是数千个)线程。你的系统没有被它们淹没的唯一原因是因为,正如我上面提到的,除了第一个实例之外的所有实例都立即无法绑定它们的ServerSockets,因此它们返回得相当快。

总之,您需要使用 one ServerSocket创建一个服务器。您需要在循环内调用accept(),但不能创建多个ServerSocket。