关于socket的迷惑

杨六 2009-10-18 11:14:15
我是个新手,最近在接触java网络编程时遇到个令我困惑的问题:服务器端监听8000端口,客户端建立一个相应的请求socket,连接没有问题,但在客户端与服务器端打印的信息令我不懂了:
客户端代码及打印信息如下:
System.out.println(socket.getInetAddress()+" "+socket.getPort
System.out.println(socket.getLocalAddress()+" "+socket.getLocalPort());
打印信息:
localhost/127.0.0.1 8000
/127.0.0.1 3799

服务端代码及打印信息如下:
System.out.println("New connection accepted " +socket.getInetAddress() + ":" +socket.getPort());
System.out.println("New connection accepted " +socket.getLocalAddress() + ":" +socket.getLocalPort());
打印信息如下:
New connection accepted /127.0.0.1:3800
New connection accepted /127.0.0.1:8000

从以上打印信息可以得到,在客户端得到的远程端口为8000,本地随机分配端口为3799,没有问题,使我迷惑打转的有:一:服务端得到的远程端口为什么是3800 二:假如是3799,服务端socket的getport()是不是与客户端相对的,就相当于客户端也是服务端的远程主机了?所以应该要得到客户端的端口 三:我个人认为服务端得到的socket与客户端的socket是一个对象,而相同的方法为什么结果不一样,貌似在服务端得到socket后应该有相应处理(这我从getlocalport()为监听端口看来的,具体的怎样处理或者与服务端绑定就不了解了) 四:假如得到的与申请的一样的话当服务端用一个accept()方法可以得到多个客户端请求时,这些socket怎样区分? 从以上问题中,貌似就单个的请求服务来看,客户端申请的socket与服务端得到的socket应该不是同一个对象的,应该只是有关联关系。。。。。。
真的是个新手,请大侠就我的问题帮解答下。谢谢!
...全文
182 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dajiadebeibei9 2009-10-19
  • 打赏
  • 举报
回复
首先你要明白 客户端与服务器是两个端口 也就是两个服务器
其次 服务器的端口是你首先定义好的 如果没有指定客户端的端口号 那么客户端的端口号是随机分配的
最后 你用accept得到不同的请求 一般都用线程来工作 这样只占用一块内存地址 这样就会按照时间片选择不同的进程工作 只是处理一个Socket 而不是很多个
  • 打赏
  • 举报
回复
公共端口名字
杨六 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kindazrael 的回复:]
Java code
getInetAddresspublic InetAddress getInetAddress()返回套接字连接的地址。//返回连接的Server端IP因为你的ServerScoket()就在本机上所以为127.0.0.1
返回:
此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回null。--------------------------------------¡­
[/Quote]
谢谢,不过还是没有让我明白为什么服务端得到的port是3800,总比客户端随机分配的端口加了1,不知道3楼的说得对不对,与同学讨论了下貌似意见不一,继续学习。。。
杨六 2009-10-19
  • 打赏
  • 举报
回复
有人解释下服务端getport()方法的端口为什么总是客户端的端口+1吗????不明白 。还是我关于通信方面的细节没弄明白 ,请大侠指教!
AldisZhan 2009-10-18
  • 打赏
  • 举报
回复

getInetAddress
public InetAddress getInetAddress()返回套接字连接的地址。

//返回连接的Server端IP因为你的ServerScoket()就在本机上所以为127.0.0.1

返回:
此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 null。

--------------------------------------------------------------------------------

getLocalAddress
public InetAddress getLocalAddress()获取套接字绑定的本地地址。

//返回这个Socket端所在机器的IP,当然是127.0.0.1了

返回:
将套接字绑定到的本地地址;如果尚未绑定套接字,则返回 InetAddress.anyLocalAddress()。

getPort
public int getPort()返回此套接字连接到的远程端口。

返回:
此套接字连接到的远程端口号;如果尚未连接套接字,则返回 0。

//因为你的客户端是 new Socket(127.0.0.1,8000) 远程的server端口为8000返回8000
--------------------------------------------------------------------------------

getLocalPort
public int getLocalPort()返回此套接字绑定到的本地端口。

//因为你的客户端是 new Socket(127.0.0.1,8000),没有指定绑定到那个IP和端口
//所以会自动选择这儿返回的端口可能是随机的,所以返回了系统自动绑定的3799

返回:
此套接字绑定到的本地端口号;如果尚未绑定套接字,则返回 -1。

// 下面的函数可参照着理解
bind
public void bind(SocketAddress bindpoint)
throws IOException将套接字绑定到本地地址。
如果地址为 null,则系统将挑选一个临时端口和一个有效本地地址来绑定套接字。


参数:
bindpoint - 要绑定到的 SocketAddress

Socket
public Socket(InetAddress address,
int port,
InetAddress localAddr,
int localPort)
throws IOException创建一个套接字并将其连接到指定远程地址上的指定远程端口。socket 会通
过调用 bind() 函数来绑定提供的本地地址及端口。
如果有安全管理器,则使用主机地址和 port 作为参数调用其 checkConnect 方法。这可能会导致
SecurityException 异常。


参数:
address - 远程地址
port - 远程端口
localAddr - 要将套接字绑定到的本地地址
localPort - 要将套接字绑定到的本地端口

stamp80 2009-10-18
  • 打赏
  • 举报
回复
网络程序的监听端口往往只是监听,如果有连接进来,它会分配其他的端口进行通信,而不是用监听端口进行通信,换句话说监听端口是不会被普通的通信占用的。
客户端的socket对象与服务器段肯定是不同的
swandragon 2009-10-18
  • 打赏
  • 举报
回复
客户端申请的socket与服务端得到的socket应该不是同一个对象

lz12366007 2009-10-18
  • 打赏
  • 举报
回复
socket 连接socketserver 获得 socket对象 然后 获得这个对象的流 就可以发送消息

客户不同 当然对象不同

我认为绑定 应该是 类似于session 的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧