您好我在服务器端使用以下代码连接多个客户端..
public class Tcpfileserver extends Thread
{
private ServerSocket serverSocket;
public static void main(String[] args)
{
Tcpfileserver obj=new Tcpfileserver();
obj.start();
}
public void run()
{
serverSocket = new ServerSocket(3000);
while(true)
{
Socket socket = serverSocket.accept(); // accept connection
TcpThread t = new TcpThread(socket); // make a thread of it
//System.out.println("Remote IP:"+socket.getInetAddress());
//System.out.println("Remote Port:"+socket.getPort());
t.start();
}}
但是当多个客户端连接到我的服务器时,其中一些客户端会超时,为什么我的终端会立即接受连接?
答案 0 :(得分:4)
尝试将最大客户端数量指定为
serverSocket = new ServerSocket(3000,10);
这里它应该接受最多10个连接而没有任何问题。
此外,您可以使用netstat -a
检查您的统计信息,即使在与一个客户端建立连接并为您的现有客户端分配了3001(或更高)/ 2999(或更小)端口后,端口3000仍在监听。 / p>
答案 1 :(得分:0)
您是否考虑使用框架? 试一试:Apache MINA
示例代码:
public abstract class DefaultServerHandler extends IoHandlerAdapter {
private SocketAcceptor acceptor;
private String socketAddress;
private int socketPort;
@Override
public void exceptionCaught(IoSession session, Throwable t)
throws Exception {
log.error(Trace.getStackTrace(t));
session.close();
}
@Override
public void messageReceived(IoSession session, Object msg) throws Exception {
//code to process received messages
}
@Override
public void sessionCreated(IoSession session) throws Exception {
log.info("Session created by: " + session.getRemoteAddress());
if (session.getTransportType() == TransportType.SOCKET) {
((SocketSessionConfig) session.getConfig())
.setReceiveBufferSize(2048);
}
session.setIdleTime(IdleStatus.BOTH_IDLE, 10);
}
public void bind() {
log.info("bind " + socketPort);
ByteBuffer.setUseDirectBuffers(false);
ByteBuffer.setAllocator(new SimpleByteBufferAllocator());
acceptor = new SocketAcceptor();
ProtocolCodecFilter codec = new ProtocolCodecFilter(
new TextLineCodecFactory(Charset.forName("UTF-8")));
SocketAcceptorConfig cfg = new SocketAcceptorConfig();
cfg.getFilterChain().addLast("codec", codec);
try {
acceptor.bind(socketAddress, this, cfg);
} catch (IOException e) {
log.error(Trace.getStackTrace(e));
}
}
public void unbind() {
log.info("unbind " + socketPort);
acceptor.unbind(new InetSocketAddress(socketPort));
}
}