java中如何实现多个客户端与服务器连接

我只能是实现一个客户端和服务器连接,再添加一个客户端就连接不了服务器... 我只能是实现一个客户端和服务器连接,再添加一个客户端就连接不了服务器 展开
 我来答
我的云盘98
推荐于2016-09-29 · TA获得超过328个赞
知道答主
回答量:179
采纳率:100%
帮助的人:83.4万
展开全部
服务器端可以采用多线程处理客户请求,例如:

package threadPool;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolServer {

private int port = 8000;
private ServerSocket serverSocket;
private ExecutorService executorService; //线程池
private final int POOL_SIZE = 4; //单个CPU时线程池中的工作线程数目

public ThreadPoolServer() throws IOException{
serverSocket = new ServerSocket(port);

//创建线程池
//Runtime 的availableProcessors()方法返回当前系统CPU的数目
//系统CPU越多,线程池中的工作线程数目越多
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);

System.out.println("服务器已启动!!");
}

public void service(){
while(true){
Socket socket = null;
try{
socket = serverSocket.accept();
executorService.execute(new Handler(socket));
}catch(IOException e){
e.printStackTrace();
}
}
}

public static void main(String[] args) {
try {
new ThreadPoolServer().service();
} catch (IOException e) {
e.printStackTrace();
}
}

}

class Handler implements Runnable {
private Socket socket;

public Handler(Socket socket) {
this.socket = socket;
}

private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}

private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}

public String echo(String msg) {
return "echo:" + msg;
}

@Override
public void run() {
try {
System.out.println("New connection accepted:" + socket.getInetAddress() + ":" + socket.getPort());
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);

String msg = null;
while ((msg = br.readLine()) != null) {
System.out.println(msg);
pw.println(echo(msg));
if (msg.equals("bye")) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
百度网友22de17705
推荐于2017-12-16 · TA获得超过328个赞
知道小有建树答主
回答量:84
采纳率:100%
帮助的人:26.7万
展开全部
这个没什么问题吧,创建多个客户端对象就行了,不知道你用的那种客户端对象。
只是注意如果绑定IP地址和端口,那么本地的IP地址和端口不能重复。
就是说多个客户端要么IP不同,要么使用的端口不同。
追问
好像需要用到多线程,能否用简单的代码说明一下?
追答

看具体需求,不一定需要多线程啊。

发代码总是提示字数超过最大了,发不了。

就贴一下构造函数好了,你需要多个客户端就使用多个TCPClient类的对象就行了。

只是每次的host和port不同就行。

class TCPClient extends Thread {

        SocketChannel sc;
        Selector selector;
        int dcount = 0;

        TCPClient(String host, int port) throws IOException {
            sc = SocketChannel.open(new InetSocketAddress(host, port));
            sc.configureBlocking(false);
            selector = Selector.open();
            sc.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE,
                    ByteBuffer.allocate(10240));
        }
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式