网络编程之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端:
Client端:
在这client就可以连接到server了,并可以相互传输数据,但是这个server只支持单用户的,就是说一次只能连接一个用户,这是为什么呢?
分析:
这最本质的原因
我想是因为在server调用accept() 时接收到一个client请求,并获得输入、输出流,在读取数据的时候,这里有一个方法是阻塞事的,那就是readLine(), 在没有读到数据时,他就一直在傻傻的等待读取client传递过来的数据,即使能读到数据,因为他是在while循环里,所以accept()不会在有得到机会执行了,也就不会接受另外一个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了。
另外一用户向连接到服务器,当前连接的用户就不许与服务器断开连接!否则永远处于等待与服务器端连接状态!
相关文章推荐
- IntentService通过HandlerThread单独开启一个线程来处理所有Intent请求对象
- 线程与网络编程(第六节:通信协议与TCP socket初识)
- 黑马程序员--图形界面中的鼠标,键盘两个事件,做一个磁盘的文件列表,菜单,子菜单,模拟记事本。网络编程,TCP的通信协议的特点
- Linux网络编程之socket:使用fork并发处理多个client的请求和对等通信P2P
- Linux C语言编程-Linux网络通信--Linux上使用套接字(socket)来处理信息---编写一个单进程非阻塞多客户的套接字客户端
- linux网络编程之socket(四):使用fork并发处理多个client的请求和对等通信p2p
- [网络编程]——TCP_Socket通信_聊天室_客户端多线程.初步形成
- linux网络编程之socket:使用fork并发处理多个client的请求
- 一个Servlet同一时刻只有一个实例。 当多个请求发送到同一个Servlet,服务器会为每个请求创建一个新线程来处理。
- linux网络编程之socket(四):使用fork并发处理多个client的请求和对等通信p2p
- socket 网络编程高速入门(一)教你编写基于UDP/TCP的服务(client)通信
- linux网络编程之socket(四):使用fork并发处理多个client的请求和对等通信p2p
- 网络编程-TCP程序实例(client端heserver端相互通信)
- 新手理解:为什么bio模式的server端每个client都需要对应一个线程
- linux网络编程之socket(四):使用fork并发处理多个client的请求和对等通信p2p
- c/c++网络编程 对象的传输 以及 TCP粘包处理 解析
- winform网络编程之TcpClient类,TcpListener类和UdpClient类
- 网络编程释疑之:TCP半开连接的处理
- 【tcp网络编程】用Socket建立一个简单的文本转换服务器
- java网络编程____httpclient多线程请求和线程池