今天突然研究一下 java 网络编程
比如我有一个服务器在服务器上开了一个 55660端口 这个是个数据服务器 假设有5个客户端 每个客户端都需要传递数据,
并且每个都是要不停地传递数据, 那么 服务器可以用这一个 55660端口么
就好像百度的服务器 每个人都访问80端口 那么多的人访问 80端口是不是在并发访问呢
但是好像端口是不能被重复使用的
看了一天有点乱 哪位大侠给讲解一下
谢谢
------解决方案--------------------------------------------------------
是的
具体是不是并发,要看你服务端是怎么写的,如果是串行的话,那就不会并发
对于 Web 服务器来说肯定是并发的
------解决方案--------------------------------------------------------
端口不能重复使用,主要是指侦听时。
在传统IO体系中:一般来说你需要有个主线程负责侦听端口,一旦accept()到连接请求,则可将其所建立的Socket连接分配给工作线程进行处理(新建或从线程池获取),此过程可称为接管;然后主线程继续等待下一个连接请求。
NIO体系中则相对更为灵活,借助事件处理机制,可以由一条线程同时负责多个连接的交互。
建议楼主找个简易的Socket程序看一看就比较清楚了,这里有个例子介绍的挺不错,循序渐进的:
http://developer.51cto.com/art/200902/108179.htm
------解决方案--------------------------------------------------------
学习了
------解决方案--------------------------------------------------------
学习了
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
还是给个例子吧:
- Java code
import java.io.*;import java.net.*;import java.util.*;public class EchoServer { public static final int PORT = 10000; public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(PORT); try { while (true) { System.out.println("服务端就绪,等待客户端连接"); // 侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。 Socket socket = serverSocket.accept(); System.out.println("有客户端连接上来了,已建立Socket链接"); EchoServerWorker worker = new EchoServerWorker(socket); System.out.println("启动工作线程"); new Thread(worker).start(); } } finally { serverSocket.close(); } }}class EchoServerWorker implements Runnable { private Socket socket; // 工作线程所服务的目标Socket EchoServerWorker(Socket socket) { this.socket = socket; } public void run() { try { try { // 准备输入输出端口 Scanner sc = new Scanner(socket.getInputStream()); OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream()); System.out.println("Socket for " + socket.getPort() + " started."); // 读取信息并直接返回,这里按行读取(\n) String str; while ((str = sc.nextLine()) != null) { System.out.println("【From Client】" + str); out.write(str + "\n"); out.flush(); } } finally { socket.close(); System.out.println("Scoket for " + socket.getPort() + " closed."); } } catch (IOException ex) { ex.printStackTrace(); } }}
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
端口就是一个,SocketServer用一个端口来接收,用多客户端socket来请求的话,可以并发来处理,一个一个处理各客户端socket。
这应该很好理解。oracle默认用1521这个端口,那每个客户进程来连接,肯定也是1521这一个端口,不可能每一个客户端进程去分别连一个不同的服务器端口的。
关于Socket编程的例子,楼主找书也好,网上找例子也好。多的是。
测试时主要一个服务端ServerSocket,客户端Socket
------解决方案--------------------------------------------------------
每个请求创建一个线程!就像那么多人访问百度一样,每个人访问开启一个线程
------解决方案--------------------------------------------------------