为什么在一个服务器对多个客户端情况下,进程会阻塞

为什么在一个服务器对多个客户端情况下,进程会阻塞,第1张

参考上一个方法。一个客户端,我可以简单的理解成一个进程。一个进程可以很多个 SOCKET。一个SOCKET 可以连接一个服务器,建立一个连接。新手,建议就用CSocket吧, 针对每个服务器实例化一个对象。 至于SOCKET模型,不急,等基本的会了,再深入。

一个端口同时只能被一个程序所占用,一个程序可以占用多个端口!

任何操作系统都不会允许你这样做的!不要给自己找麻烦了,这是不可能事件!

有时候一台电脑可能跑两个客户端,第一个客户端已经占用了端口了,那么第二个就会出错!但是我通常不会指定客户端的端口号!

如何解决呢?下面是自己的方法:

当客户端要连接服务端时,客户端会随机选择一个端口发送数据包出去!它随机选择的这个端口一定是可用的!所以我就用这个随机选择的端口作为客户端接收信息的端口号!

那么不管电脑上跑多少个客户端都不会有问题了!(当然最多也就跑65536个网络程序,因为只有65536个端口嘛)

用一个Socket只能是一个客户端与服务器连接,如果要多个客户端,需要多个Socket,每次有客户端加入,都新建一个Socket,并且与之对应新建一个线程

建议使用HashMap实现。

服务器监听端口 做个无限循环 接到一个连接就创建一个通道线程,并将通道线程存储到一个list集合中

import javaioBufferedReader;

import javaioIOException;

import javaioInputStreamReader;

import javaioPrintWriter;

import javanetServerSocket;

import javanetSocket;

import javatextSimpleDateFormat;

import javautilArrayList;

import javautilDate;

import javautilList;

/

  4用socket通讯写出多个客户端和一个服务器端的通讯,

  要求客户发送数据后能够回显相同的数据(回显功能)(实用TCP方式)。

 /

public class Test4Server {

// 主入口

public static void main(String[] args) throws IOException {

scoketServer();

}

// 开启的tcp8888监听端口

public static void scoketServer() throws IOException {

ServerSocket server = new ServerSocket(8888);

while (true) {

// 未连通前线程阻塞,连通后开启一个socket通道线程后继续监听8888端口

Socket socket = serveraccept();

Systemoutprintln(socketgetInetAddress()getHostAddress()

+ "连接进入");

new SocketThread(socket)start();

}

}

}

// 一个服务器端口中监听多个客服端通道线程

class SocketThread extends Thread {

//  所有通道写入流的集合

private static List<PrintWriter> list =new ArrayList<PrintWriter>();

private BufferedReader bufferedReader;

private PrintWriter printWriter;

public SocketThread(Socket socket) throws IOException {

thisbufferedReader = new BufferedReader(new InputStreamReader(socket

getInputStream()));

thisprintWriter = new PrintWriter(socketgetOutputStream());

listadd(printWriter);

}

@Override

public void run() {

String string = null;

while (true) {

try {

// 服务器在通道中读到的信息回显给客服端

string = bufferedReaderreadLine();

Systemoutprintln("客服端信息:" + string);

for(PrintWriter printWriter:list ){

printWriterwrite("服务器回显:" + string + "\r\n");

printWriterflush();

}

} catch (IOException e) {

}

}

}

}

客服端代码   可以用在局域网中用多台来连接测试

import javaioBufferedReader;

import javaioIOException;

import javaioInputStreamReader;

import javaioPrintWriter;

import javanetSocket;

import javautilScanner;

public class Test4Client {

public static Object obj = new Object();

// 客服端的主入口

public static void main(String[] args) throws IOException {

socketClient();

}

// 与服务器连通地址本机(127001),局域网中其他机器是(服务器在局域网中的ip地址) 端口都是8888

public static void socketClient() throws IOException {

Socket socket = new Socket("127001", 8888);

if (socketisConnected()) {

// 如果连接成功了就开启写和读的进程

new writer(socket)start();

new read(socket)start();

} else {

Systemoutprintln("服务器未开启");

}

}

}

// 写入到通道的线程

class writer extends Thread {

@SuppressWarnings("unused")

private Socket socket;

private PrintWriter printWriter;

private Scanner scanner = new Scanner(Systemin);

private String str = null;

public writer(Socket socket) throws IOException {

thissocket = socket;

thisprintWriter = new PrintWriter(socketgetOutputStream());

}

@Override

public void run() {

scanneruseDelimiter("\r\n");

while (true) {

Systemoutprint("请输入信息:");

// 产生扫描器的线程阻塞

str = scannernext();

Systemoutprintln("我说:"+str);

printWriterwrite(str + "\r\n");

printWriterflush();

try {

Threadsleep(200);

} catch (InterruptedException e) {

eprintStackTrace();

}

}

}

}

// 从通道中读取的线程

class read extends Thread {

private Socket socket;

private BufferedReader bufferedReader;

private String str = null;

public read(Socket socket) throws IOException {

thissocket = socket;

thisbufferedReader = new BufferedReader(new InputStreamReader(socket

getInputStream()));

}

@Override

public void run() {

while (true) {

try {

str = bufferedReaderreadLine();

Systemoutprintln(str);

} catch (IOException e) {

}

try {

Threadsleep(200);

} catch (InterruptedException e) {

eprintStackTrace();

}

}

}

}

只要资源

(内存硬盘cpu)足够,理论上可以接收无限个链接。所谓65535的限制,是针对客户端的,客户机每链接一个服务,就必须开一个tcp端口与之对应。这样,链接到65535个服务后,本地端口就被占满。服务端口仅仅使用一个。一个tcp链接,是四个元素决定的,server

IP:port+client IP:port。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 为什么在一个服务器对多个客户端情况下,进程会阻塞

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情