疯狂Java讲义:使用Socket进行通信[2]

疯狂Java讲义:使用Socket进行通信[2],第1张

程序清单 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

最近我在在写一个APP,用到了socket,在自己电脑上搭建的服务器,具体过程: 用eclipse写Java代码,创建一个serversocket,用来监听客户端的请求; 客户端在发送数据前,首先创建一个Socket,然后直接请求服务器即可。自己写了一个Android的APP,想用socket连接服务器

不是很复杂。具体思路:
1在服务器端写一个程序,这程序进行读取数据库中你想要的数据,然后再通过socket服务端发送给客户端。
2写个socket客户端 。
android的不知道是不是这样!

我对你问题的理解就是处于listen状态的socket最多能accept()多少个连接,使其处于established状态。
这个受本地环境( *** 作系统)的限制,我们知道一个socket会占用一个文件描述符,所以:
1、打开多少个socket会受到 *** 作系统对进程所打开文件描述符数量的限制。ulimit -n
2、 *** 作系统自身也会对打开文件的总数量有限制,这个和当前机器内存环境有关。

采用多线程,服务器端每ACCEPT一个连接后,针对生成的CLIENTSOCKET创建一个线程,在每个新建的线程中完成通信交互过程,大概不会出现你说的问题了。
PS,还有一点一定要牢记,就是TCP 流式套接字只保证“有序无误”,但不能保证收发双方的次数和内容一定相同,就是说可能发100次,但是接收次数可能只有一次。

s
=
new
Socket("127001",
8880)
前面那个IP是服务器的地址,只要这个IP写正确了,服务器放在哪里,客户端都能连上去的。
1270。01最简单的解释就是本机地址,你用这个IP,访问的就是你自己。
你可以去服务器上查看一下网络地址,然后把1270。01换成服务器的IP。

socket连接后等待被连接方返回的命令,应该是先返回“login”,然后发包“用户名”,等待接收“password”,然后再发包“密码”。然后返回“>”

在百度中搜索SocketTool可以找到该测试软件的下载地址。

下载完成后,软件是一个单独的运行程序,可以直接打开软件。

软件的界面很简单,在左侧有tcp和udp的客户端或服务端的快捷按钮,上方有创建删除退出等选项按钮。

我们先来建立TCP的测试服务端。点击TCP Server再点击创建。

选择一个监听端口,这里我们使用6001作为服务端的监听端口。

建立完成后,服务端会自动启动,软件会显示启动监听的状态。

我们可以检测一下本机的6001端口是否已经打开。在DOS窗口中输入命令netstat -a,可以在列表中看到本机的6001端口的状态为listening的状态,表

示本机的6001端口正处于监听的状态。

在DOS窗口中输入命令telnet 1921680140 6001来登录本地的6001端口。

点击回车键,就可以成功登录6001端口。在测试软件中就可以看到状态是已连接的状态,同时也可以看到对方的ip就是本地ip。

再来测试通信情况,在DOS窗口中输入a、b、c,在软件的接收窗口就可以看到收到的数据了。

在软件的发送窗口中输入1234567890,点击发送后,在DOS窗口中就可以看到软件发送过来的数据了。

测试完成后,在软件中点击停止监听,同时在DOS窗口中可以看到失去了跟主机的连接,表示测试连接已经断开。

再来创建TCP的客户端,点击TCP Client再点击创建。会d出创建socket客户端窗口,输入对方的ip和对方的端口,点击确认。

tcp的客户端已经建立好,如果对方的端口监听正常的话,点击连接就可以连接到对方的端口和对方进行测试通信了。

cp的客户端已经建立好,如果对方的端口监听正常的话,点击连接就可以连接到对方的端口和对方进行测试通


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

原文地址: http://outofmemory.cn/zz/13422068.html

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

发表评论

登录后才能评论

评论列表(0条)

保存