您的位置:首页 > 理论基础 > 计算机网络

网络编程之TCP通信,为什么在Serve端为每个Client端开辟一个单独的线程来处理Client的请求

2011-06-06 12:33 495 查看
我们知道一个好的服务器是要支持多用户的,就是说在同一时间可以允许多个用户访问,而不会发生通信障碍,要怎样做到这一点呢?那最好的办法就是使用多线程,在Serve端为每个Client端开辟一个单独的线程来处理Client的请求, 那么为什么在Serve端为每个Client端开辟一个单独的线程来处理Client的请求?

个人理解:

在TcpServer端需要调用accept()方法来接受client的请求,accept()会生成一个Socket对象,这个server和client就是使用这个Socket来进行通信的,通过Socket就可用获得输入、输出流,就可以在server和client之间来回传递信息了。在这使用实例程序并加以分析:

实例代码: 1、不使用多线程的情况

Server端:

package cn.ticast.tcp;
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;
/**
* 将接收到的client传过来的数据进行转换成大写
* @author asus
*
*/
public class ReverseServer {
/**
* @param args 为服务器要使用的端口
*/
public static void main(String[] args) {
try {
ServerSocket ss = null;
if (args.length < 1) {
ss = new ServerSocket(8002);
} else {
ss = new ServerSocket(Integer.parseInt(args[0]));
}
boolean bRunning = true;
while (bRunning) {
Socket s = ss.accept();
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
PrintWriter pw = new PrintWriter(out, true);
while (true) {
String strLine = br.readLine();
if (strLine == null) {
break;
} else if (strLine.equalsIgnoreCase("quit")) {
break;
}
String strReverse = new StringBuffer(strLine).reverse().toString();
System.out.println(strReverse);

pw.println(strLine + "---> " + strReverse);
}
br.close();
pw.close();
}
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


Client端:

package cn.ticast.tcp;
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.Socket;
import java.net.UnknownHostException;
public class ReverseClient {
public static void main(String[] args) {
try {
Socket s = null;
if (args.length < 2) {
System.out.println("请输入需要连接的主机和端口号");
} else {
String strIP = args[0];
int port = Integer.parseInt(args[1]);
s = new Socket(strIP, port);
}
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(in));
PrintWriter pw = new PrintWriter(out, true);

} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
}


在这client就可以连接到server了,并可以相互传输数据,但是这个server只支持单用户的,就是说一次只能连接一个用户,这是为什么呢?

分析:

最本质的原因

我想是因为在server调用accept() 时接收到一个client请求,并获得输入、输出流,在读取数据的时候,这里有一个方法是阻塞事的,那就是readLine(), 在没有读到数据时,他就一直在傻傻的等待读取client传递过来的数据,即使能读到数据,因为他是在while循环里,所以accept()不会在有得到机会执行了,也就不会接受另外一个client了。

另外一用户向连接到服务器,当前连接的用户就不许与服务器断开连接!否则永远处于等待与服务器端连接状态!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐