今天突然研究一下 java 网络编程
比如我有一个服务器在服务器上开了一个 55660端口 这个是个数据服务器 假设有5个客户端 每个客户端都需要传递数据,
并且每个都是要不停地传递数据, 那么  服务器可以用这一个 55660端口么就好像百度的服务器 每个人都访问80端口 那么多的人访问 80端口是不是在并发访问呢但是好像端口是不能被重复使用的 看了一天有点乱 哪位大侠给讲解一下 谢谢

解决方案 »

  1.   

    是的具体是不是并发,要看你服务端是怎么写的,如果是串行的话,那就不会并发对于 Web 服务器来说肯定是并发的
      

  2.   

    端口不能重复使用,主要是指侦听时。在传统IO体系中:一般来说你需要有个主线程负责侦听端口,一旦accept()到连接请求,则可将其所建立的Socket连接分配给工作线程进行处理(新建或从线程池获取),此过程可称为接管;然后主线程继续等待下一个连接请求。NIO体系中则相对更为灵活,借助事件处理机制,可以由一条线程同时负责多个连接的交互。
    建议楼主找个简易的Socket程序看一看就比较清楚了,这里有个例子介绍的挺不错,循序渐进的:
    http://developer.51cto.com/art/200902/108179.htm
      

  3.   

    还是给个例子吧:
    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();
            }
        }}
      

  4.   

    端口你可以理解为用于"全球(全范围)唯一定位"程序用的,假如有一程序(客户端)欲与网络上某一程序交互(不知道如果没有网络是否也可以存在port概念,觉得至少用处没那么大了),通过ip+port 方式可以唯一定位一个工作程序,因为同一ip上可以有多个程序同时运行,加上port才足以唯一定位。而多少个client program可以与这个server program同时交互,这是另外一会事。
      

  5.   

    端口就是一个,SocketServer用一个端口来接收,用多客户端socket来请求的话,可以并发来处理,一个一个处理各客户端socket。这应该很好理解。oracle默认用1521这个端口,那每个客户进程来连接,肯定也是1521这一个端口,不可能每一个客户端进程去分别连一个不同的服务器端口的。关于Socket编程的例子,楼主找书也好,网上找例子也好。多的是。测试时主要一个服务端ServerSocket,客户端Socket 
      

  6.   

    例子很给力 在请教一下 一般情况下 一个端口 可以保持多少个这样的连接呢  xp3 win2k 2003 win7 linux 有什么明显的区别么 谢谢
      

  7.   

    楼主问的问题很有意思。
    这不是什么保持这样的连接,处理完一个socket之后,就可以接着处理下一个了。
    理论讲,只要ServerSocket不停的循环接收请求,就可以一直处理,有多少个都行。
      

  8.   


    限制主要两个:
    1、线程数,传统IO模型,每条线程负责服务一个Socket;线程切换是有代价的,其次线程规模也是有限的,根据配置不同可以达到几千个,所以线程数限制了服务能力;当然这个可以问题可以用NIO来解决;
    2、每个连接会消耗操作系统的一个句柄(handle),而操作系统的句柄数是有限的,当然也可以配置,几十万是问题不大的,百万以上要特殊配置了;看你有啥具体需要可以继续探讨。
      

  9.   

    嗯 晚上简要的学习一下tcp发现还真是什么都不会啊 目前估计的最后一个问题一个tcp的链接由四个要素确定本机ip端口和对方ip端口那么当本帖开始的时候的那个情况一个本机的10000端口用来接收别人访问的时候 数据都从一个端口进来 只是对方的端口号不同(对方的ip也是本机的情况下) 这种情况下是由网卡的底层驱动还是由java的jvm 还是java程序保证对应的端口号的链接发来的数据能发给和这个端口连接的线程也就是说10000号端口进来的信息 那个程序分拣呢(多线程并发的情况下) 我估计是java分拣的因为确定信息在java里       EchoServerWorker worker = new EchoServerWorker(socket);不知道对不对PS附上感觉有用的帖子备查...http://blog.163.com/w1n2006@126/blog/static/1187348392009117102159352/http://www.ha97.com/956.htmlhttp://rockecsn.iteye.com/blog/1557727http://halfonline.blog.163.com/blog/static/1634831832011895035945/
     
    http://hi.baidu.com/onlys_c/blog/item/bc6a25f8da6ddc01d9f9fd3b.htmlhttp://blog.csdn.net/chpdirector84/article/category/733164http://www.ha97.com/818.html
      

  10.   

    对这个10000端口的程序来说,它接收到的只是按顺序而来的消息包(客户端的多线程在这里已经无从体现),底层肯定会首先处理,最终交由java程序处理,至于处理规则可以任意,比如可以放入足够长的队列然后统一或分别处理,可以多线程,可以单线程。
      

  11.   

    如果端口的对应关系有java处理是否可以认为 tcp/ip协议是在java里实现的呢 
      

  12.   


    操作系统级别完成了。操作系统一般使用五元组(或四元组)来识别一个TCP会话,每个会话会被分配一个唯一的句柄(handler);Java这边处理其实很简单,直接按句柄区分就行了,其它的都是依赖操作系统能力。
      

  13.   

    服务器是分层的,默认的http协议的端口号是80,你要用http协议的话才涉及到这个端口号,写程序时你可以自定义端口号,只要在指定范围内,且此端口没被占用就行了
      

  14.   

    服务器是分层的,默认的http协议的端口号是80,你要用http协议的话才涉及到这个端口号,写程序时你可以自定义端口号,只要在指定范围内,且此端口没被占用就行了