Java中服务器端ServerSocket对象怎么获取服务器端地址和端口号,怎么获取远程请求的

Java中服务器端ServerSocket对象怎么获取服务器端地址和端口号,怎么获取远程请求的,第1张

ServerSocket s = new ServerSocket(8888);

while (true) {

// 建立连接

Socket socket = saccept();

/ /getInetAddress()获取远程ip地址,getPort()远程客户端的断后好

"你好,客户端地址信息: " + socketgetInetAddress() + "\t客户端通信端口号: " + socketgetPort()

IPAddress remote_ip = ((SystemNetIPEndPoint)workerSocketRemoteEndPoint)Address;//获取远程连接IP

server = new SocketServer(3389);

Socket s = serveraccept();

sgetInetAddress()getHostAddress()

新建一个ServerSocket对象然后用accept()方法接受请求连接的Socket对象在调用获得的Socket对象的getInetAddress()方法获取InetAddress对象在调用InetAddress对象的getHostAddress方法来获取IP地址。

对于已经建立的tcp连接,内核socket关联着两个队列,SEND_Q与RECV_Q,其中SEND_Q是tcp连接的发送缓冲区,如果接受端的接受缓存区满啦,则发送端的数据就会积压在SEND_Q中,并且会伴有接收端zero window的通告以及发送端的坚持定时器。

使用netstat和ss命令都可以查看socket的send_q与recv_q队列的数据情况。

注:listen状态的tcp连接的send_q与recv_q的含义与establish状态的tcp连接不同。

其中listen tcp的send_q代表listen backlog的长度,涉及到已连接队列与半连接队列等概念。recv_q代表着已完成3次握手的establish状态的连接并且没有被accept取走的连接数量。

程序清单 codes/ / /Client java

public class Client

{

public static void main(String[] args)

throws IOException

{

Socket socket = new Socket( )

//将Socket对应的输入流包装成BufferedReader

BufferedReader br = new BufferedReader(

new InputStreamReader(socket getInputStream()))

//进行普通IO *** 作

String line = br readLine()

System out println( 来自服务器的数据 + line)

//关闭输入流 socket

br close()

socket close()

}

}

上面程序中粗体字代码是使用ServerSocket和Socket建立网络连接的代码 斜体字代码是通过Socket获取输入流 输出流进行通信的代码 通过程序不难看出 一旦使用ServerSocket Socket建立网络连接之后 程序通过网络通信与普通IO并没有太大的区别

先运行上面程序中的Server类 将看到服务器一直处于等待状态 因为服务器使用了死循环来接受来自客户端的请求 再运行Client类 将可看到程序输出 来自服务器的数据 您好 您收到了服务器的新年祝福! 这表明客户端和服务器端通信成功

上面程序为了突出通过ServerSocket和Socket建立连接 并通过底层IO流进行通信的主题 程序没有进行异常处理 也没有使用finally块来关闭资源

实际应用中 程序可能不想让执行网络连接 读取服务器数据的进程一直阻塞 而是希望当网络连接 读取 *** 作超过合理时间之后 系统自动认为该 *** 作失败 这个合理时间就是超时时长 Socket对象提供了一个setSoTimeout(int timeout)来设置超时时长 如下的代码片段所示

Socket s = new Socket( )

//设置 秒之后即认为超时

s setSoTimeout( )

当我们为Socket对象指定了超时时长之后 如果在使用Socket进行读 写 *** 作完成之前已经超出了该时间限制 那么这些方法就会抛出SocketTimeoutException异常 程序可以对该异常进行捕捉 并进行适当处理 如下代码所示

try

{

//使用Scanner来读取网络输入流中的数据

Scanner scan = new Scanner(s getInputStream())

//读取一行字符

String line = scan nextLine()

}

//捕捉SocketTimeoutException异常

catch(SocketTimeoutException ex)

{

//对异常进行处理

}

假设程序需要为Socket连接服务器时指定超时时长 即经过指定时间后 如果该Socket还未连接到远程服务器 则系统认为该Socket连接超时 但Socket的所有构造器里都没有提供指定超时时长的参数 所以程序应该先创建一个无连接的Socket 再调用Socket的connect()方法来连接远程服务器 而connect方法就可以接受一个超时时长参数 如下代码所示

//创建一个无连接的Socket

Socket s = new Socket()

//让该Socket连接到远程服务器 如果经过 秒还没有连接到 则认为连接超时

s connconnect(new InetAddress(host port) )

       返回目录 疯狂Java讲义

       编辑推荐

       Java程序性能优化 让你的Java程序更快 更稳定

       新手学Java 编程

       Java程序设计培训视频教程

lishixinzhi/Article/program/Java/hx/201311/27265

可以的。

首先确保你已经建立了ServerSocket(对象名字是server),并接受到了连接:

ArrayList<Socket > sockets = new ArrayList<Socket>(); //保存所有接受的socket

while(true){ //一直接受连接

Socket s = serveraccept();

socketsadd(s);

}

///得到仍处于连接当中的Socket

public ArrayList<Socket > getConnectedSockets(){

ArrayList<Socket > alivedSockets = new ArrayList<Socket>();

for(int i=0;i<socketssize();i++){

if(socketsget(i)isConnected()){

alivedSockets add(socketsget(i));

}

}

return alivedSockets;

}

以上就是关于Java中服务器端ServerSocket对象怎么获取服务器端地址和端口号,怎么获取远程请求的全部的内容,包括:Java中服务器端ServerSocket对象怎么获取服务器端地址和端口号,怎么获取远程请求的、怎么用Socket.RemoteEndPoint 获取客户端IP和端口 、用socket怎么获取本机ip等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10073685.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存