预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

JavaSocketCS示例程序 1背景介绍 Java是随着网络的盛行而逐渐被人认可的,可想而知其网络编程的能力有多 强大。本文介绍一个JavaSocketCS模型的一个简单示例,简单但不低端。 程序是在本地模拟CS模型,即服务端和客户端两个程序可以相互通信。实 现形式是两个程序分别定义好要说的话,然后按顺序交互在终端打印。 2Socket通信过程 真实中的通信类似QQ是两个或多个程序在不同的电脑上,通过互联网交换 信息。程序间是通过通过(IP地址:端口号)的形式来实现互相访问的。那么 两个程序在本地又是怎么能互相连接的,又是如何交换信息的? 仔细看上图,首先建立监听程序SeverSocket()来作为服务端,服务端调用 accept()方法不断在所设端口监听是否有要求连接的请求。 此时建立客户端程序,该客户端是以发送Socket()套接字的方式建立的。客 户端往所设端口去请求服务,如果遇到accept(),则双方达成连接共识于是建立 连接。连上之后,双方是通过发送socket套接字来实现交流的。套接字封装了网 络通信底层包括协议,端口地址等信息。 客户端要发送信息,其次用建立输出流,输出流另外一段是socket套接字, 只要往该流里面println()数据,则会自动封装到该套接字里面。发送时,将socket 套接字发送给服务端。 服务端收到套接字,从套接字找到携带的信息放入输入流,然后输入流端通 过readLine()就可以直接将信息打印在屏幕上了。 此时服务端要往客户端发送信息,过程一样,将信息写入输出流,然后封装 成套接字,对方接受套接字,将信息放到输出流,然后就能输出该信息了。 套接字起到了封转底层的作用,程序互联变得很容易,而用输入输出流连接 中介转接套接字,一是套接字无法直接输出内容,二是通过流的形式输入输出信 息,是Java推荐的,因为其本身包含大量方法,用起来会非常得心应手。 最后,要关闭连接要释放端口等资源。 3示例过程介绍 本段通过具体例子来加深读者对Socket通信过程的印象。 1)建立服务器ServerSocket() 2)服务器调用accept()方法来监听9999端口。 3)建立客户端Socket,往9999端口发送套接字,请求连接。 4)服务器accept()方法收到一个套接字,说是某某程序想要跟服务器建立 连接。accept()接受该请求,于是俩程序建立连接。 5)现在客户机想给服务器发送一个字符串“你好,我是客户机”。首先客 户机将该字符串用Println()封装到输出流PrintWriter里面, PrintWriter将该信息再封装到套接字socket里面。于是再向服务器端 口发送套接字。 6)服务器端口又接到套接字,将该套接字放到InputStreamReader里面解 封装,再用readLine()方法读取里面的字符串,print()到屏幕上面,打 印出“你好,我是客户机”。 7)服务器想回送客户机一个信息,如“我是服务器,你发来的信息已收到”。 同样是将该字符串封装到输出流PrintWriter里面,该输出流再封装成 套接字socket,发送给客户端。 8)客户端同样是接收该套接字,解封装到输入流InputStreamReader,然 后再从该流里面readLine()取出信息,print()打印到屏幕,出来“我是 服务器,你发来的信息已收到”的信息。如此可实现反复的半双工通信。 9)双方用close()方法释放连接。 4完整代码 服务器端程序(tempServer) 5packagecom.futeng.temp; 6/* 7*内容:JavaSocket编程示例(@futeng) 8*制作:@futeng#1.0/2012/0731 9*说明: 10*/ 11importjava.io.BufferedReader; 12importjava.io.InputStreamReader; 13importjava.io.PrintWriter; 14importjava.net.*; 15 16publicclasstempServer{ 17/* 18*服务端Server客户端Client 19* 20*服务器监听ServerSocekt() 21*| 22*阻塞,等待客户连接accept()<--------发送连接请求Socket() 23*|| 24*|| 25*读取客户端所发送的数据readLine()<--------向服务端发送数据Println() 26*|| 27*向客户端发送数据Println------------>读取服务端信息readLine() 28*|| 29*关闭连接close()关闭连接close() 30* 31*/