日期:2014-05-17  浏览次数:20629 次

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
------解决方案--------------------
每个请求创建一个线程!就像那么多人访问百度一样,每个人访问开启一个线程
------解决方案--------------------