读书人

java 套接字 端口有关问题

发布时间: 2012-09-08 10:48:07 作者: rapoo

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


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

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

[解决办法]
探讨
一个本机的10000端口用来接收别人访问的时候 数据都从一个端口进来 只是对方的端口号不同(对方的ip也是本机的情况下)

这种情况下是由网卡的底层驱动还是由java的jvm 还是java程序保证对应的端口号的链接发来的数据能发给和这个端口连接的线程

[解决办法]
探讨
如果端口的对应关系有java处理是否可以认为 tcp/ip协议是在java里实现的呢

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

读书人网 >Java Web开发

热点推荐