当前位置: 代码迷 >> Java Web开发 >> java 套接字 端口有关问题
  详细解决方案

java 套接字 端口有关问题

热度:5155   发布时间:2013-02-25 21:13:38.0
java 套接字 端口问题
今天突然研究一下 java 网络编程
比如我有一个服务器在服务器上开了一个 55660端口 这个是个数据服务器 假设有5个客户端 每个客户端都需要传递数据,
并且每个都是要不停地传递数据, 那么 服务器可以用这一个 55660端口么

就好像百度的服务器 每个人都访问80端口 那么多的人访问 80端口是不是在并发访问呢

但是好像端口是不能被重复使用的

 看了一天有点乱 哪位大侠给讲解一下 

谢谢

------解决方案--------------------------------------------------------
是的

具体是不是并发,要看你服务端是怎么写的,如果是串行的话,那就不会并发

对于 Web 服务器来说肯定是并发的
------解决方案--------------------------------------------------------
端口不能重复使用,主要是指侦听时。

在传统IO体系中:一般来说你需要有个主线程负责侦听端口,一旦accept()到连接请求,则可将其所建立的Socket连接分配给工作线程进行处理(新建或从线程池获取),此过程可称为接管;然后主线程继续等待下一个连接请求。

NIO体系中则相对更为灵活,借助事件处理机制,可以由一条线程同时负责多个连接的交互。


建议楼主找个简易的Socket程序看一看就比较清楚了,这里有个例子介绍的挺不错,循序渐进的:
http://developer.51cto.com/art/200902/108179.htm
------解决方案--------------------------------------------------------
学习了
------解决方案--------------------------------------------------------
学习了
------解决方案--------------------------------------------------------
探讨
比如 主机开的端口是10000 被主线程分配给别的分线程了之后还占用10000号端口通信么 还是占用了 另一个临时的端口

------解决方案--------------------------------------------------------
还是给个例子吧:

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();        }    }}
------解决方案--------------------------------------------------------
探讨

比如 主机开的端口是10000 被主线程分配给别的分线程了之后还占用10000号端口通信么 还是占用了 另一个临时的端口

------解决方案--------------------------------------------------------
端口就是一个,SocketServer用一个端口来接收,用多客户端socket来请求的话,可以并发来处理,一个一个处理各客户端socket。

这应该很好理解。oracle默认用1521这个端口,那每个客户进程来连接,肯定也是1521这一个端口,不可能每一个客户端进程去分别连一个不同的服务器端口的。

关于Socket编程的例子,楼主找书也好,网上找例子也好。多的是。

测试时主要一个服务端ServerSocket,客户端Socket
------解决方案--------------------------------------------------------
每个请求创建一个线程!就像那么多人访问百度一样,每个人访问开启一个线程
------解决方案--------------------------------------------------------
  相关解决方案