socket客户端连接异常 问一个socket server的问题,我现在是可以多条client连接Server,,一般是先连接,然后发送数据,,但是我现在出现的问题是当一个client连接Server的时候只连接上但不发送数据,这时候其它的client也进不来了,,想问下有没有好的思路啊,, 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ServerSocket 监听的线程,除了 accept() 不要做别的事,给每个连入的 Socket 单独分配一个线程。为了共享状态,使用相同的逻辑对待所有连入的 Socket,可以用 inner class,比如下面这样的设计:import java.io.IOException;import java.io.PrintStream;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public abstract class SocketServer implements Runnable { public static void main(String[] args) throws Exception { SocketServer server = new SocketServer(4321) { @Override protected void serve(Socket socket) { try { PrintStream ps = new PrintStream(socket.getOutputStream()); ps.println("Hello!"); ps.flush(); ps.close(); socket.close(); } catch(IOException ex) { ex.printStackTrace(); } } }; server.start(); // ... } private final int port; private volatile boolean runFlag; private ExecutorService executor; public SocketServer(int port) { this.port = port; } @Override public void run() { ServerSocket ss = null; try { ss = new ServerSocket(port); runFlag = true; while( runFlag ) { Socket socket = ss.accept(); if( runFlag ) getExecutor().submit(new Connection(socket)); } } catch(IOException ex) { throw new RuntimeException(ex); } finally { try { if( ss != null ) ss.close(); } catch(Exception e) { // log exception } } } public void start() { getExecutor().submit(this); } public void stop() { runFlag = false; try { new Socket("127.0.0.1", port).close(); } catch(IOException ex) { // not important } } protected abstract void serve(Socket socket); protected ExecutorService getExecutor() { if( executor == null ) executor = Executors.newCachedThreadPool(); return executor; } private class Connection implements Runnable { private final Socket socket; private Connection(Socket socket) { this.socket = socket; } @Override public void run() { serve(socket); } }} 先去了解下阻塞式IO和异步式IO(NIO) 一个Scanner获取键盘输入的问题 怎么将java程序变成像qq,word一样的应用程序 编程求助 Java连接MySQL数据库的问题 一个超链接的正则表达式的问题 Thinking in Java 讨论区 **********JTable问题,很困惑************* 我是一个初学者,能不能告诉我,J++ 编译器与 jb 编译器的区别 悲哀啊,java 版逐渐被蚕食中 快来帮帮我!!!! 已知二叉树层次遍历字符串和子节点数,求二叉树 一个用java编的项目,为什么用netbeans可以导入,用Myeclipse就不能导入呢
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public abstract class SocketServer implements Runnable {
public static void main(String[] args) throws Exception {
SocketServer server = new SocketServer(4321) { @Override
protected void serve(Socket socket) {
try {
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("Hello!");
ps.flush();
ps.close();
socket.close();
}
catch(IOException ex) {
ex.printStackTrace();
}
}
};
server.start();
// ...
}
private final int port;
private volatile boolean runFlag;
private ExecutorService executor;
public SocketServer(int port) {
this.port = port;
}
@Override
public void run() {
ServerSocket ss = null;
try {
ss = new ServerSocket(port);
runFlag = true;
while( runFlag ) {
Socket socket = ss.accept();
if( runFlag )
getExecutor().submit(new Connection(socket));
}
}
catch(IOException ex) {
throw new RuntimeException(ex);
}
finally {
try {
if( ss != null )
ss.close();
}
catch(Exception e) {
// log exception
}
}
}
public void start() {
getExecutor().submit(this);
}
public void stop() {
runFlag = false;
try {
new Socket("127.0.0.1", port).close();
}
catch(IOException ex) {
// not important
}
}
protected abstract void serve(Socket socket);
protected ExecutorService getExecutor() {
if( executor == null )
executor = Executors.newCachedThreadPool();
return executor;
}
private class Connection implements Runnable {
private final Socket socket;
private Connection(Socket socket) {
this.socket = socket;
} @Override
public void run() {
serve(socket);
}
}
}