2

我是java新手,我正在尝试学习如何使用套接字。

我正在尝试编写一个简单的文本信使,服务器 - 客户端,但我不知道如何让服务器始终监听客户端的流:

这是服务器代码,现在它只管理 1 个传入连接,当客户端连接时,服务器向它发送一条消息:

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

public class SocketServer {

private InetAddress ServerAddress;
private int ServerPort;
private int ServerQueue;
private ServerSocket Server;

public SocketServer(String ServerAddress, int ServerPort, int ServerQueue)
{
    try
    {
        this.ServerAddress = InetAddress.getByName(ServerAddress);
    }
    catch (UnknownHostException uhe)
    {
        uhe.printStackTrace();
    }
    this.ServerPort = ServerPort;
}

public boolean ServerCreate()
{
    try
    {
        Server = new ServerSocket(this.ServerPort, 10, this.ServerAddress);
        System.out.println("System Message: Server started!");
        return true;
    }
    catch(IOException ioe)
    {
        ioe.printStackTrace();
        System.out.println("System Message: Can't start server!");
        return false;
    }
}

public void ServerStartListening()
{
    int exit = -1;
    while(exit < 1)
    {
        try 
        {
            Socket client = this.Server.accept();
            OutputStream clientout = client.getOutputStream();
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientout));
            bw.write("Welcome: "+client.toString());
            bw.close();
        } 
        catch (IOException ex) 
        {
            ex.printStackTrace();
        }  
    }
}
}

对不起,我的英语不好。

4

3 回答 3

3

您需要实现多线程以侦听多个传入请求。请参考此链接:oracle 提供的一个非常好的多线程服务器示例

于 2012-11-14T21:46:45.887 回答
2

你需要阅读某事。关于线程。这是一个初始代码:

ServerSocket socketListener;
DoSthWithThisSocket doSthWithThisSocketObj;
socketListener = new ServerSocket(LISTENINGPORT);
Socket socket;
Thread doSthWithThisSocketThread;

while (continueSocketListening()) {
    socket = socketListener.accept();
    doSthWithThisSocketObj = new DoSthWithThisSocket(socket);
    doSthWithThisSocketThread = new Thread(doSthWithThisSocketObj);
    doSthWithThisSocketThread.start();
}
于 2012-11-14T21:48:31.637 回答
1

在 Java 中创建多客户端套接字服务器有两个主要选项:

  • 正如之前的响应者建议的那样,为每个新的客户端 TCP 连接启动一个新线程。这适用于小型/玩具服务器,以及刚开始使用套接字时。这里最大的缺点是这种方法无法扩展 - 只需考虑拥有一千个并发客户端......
  • 将 IO 多路复用与 Java NIO 包提供的非阻塞套接字一起使用,将接受/读/写事件分派给已注册的回调。您可以使用工作项队列和预先分配的工作线程池来扩展它,以利用硬件中的多个内核/CPU。
于 2012-11-14T22:13:23.517 回答