湖北广播电视大学学报
Journal of HuBei TV University
Vol.23,No.1
January.2006,139~140
J ava 中的socket 网络编程
曹鸿霞
(襄樊广播电视大学 湖北 襄樊 441021)
[摘要] 使用socket 函数进行网络编程,学习创建一个简单的socket 客户端和一个处理socket 连接的服务器。
[关键词] 套接字socket ;客户端client ;服务器server
[中图分类号] TP393 [文献标识码] A [文章编号] 1008-7424(2006)01-0139-02
[收稿日期]2005-10-10
[作者简介]曹鸿霞,女,襄樊广播电视大学副教授。
J ava 程序员使用socket 函数进行网络编程是很重要的。你可能需要设计一个客户端通过socket 连接与服务
器交互,或者,你需要设计一个服务器监听socket 连接,无论哪种情况,你都会用到socket 编程。那么,什么是socket ?socket 是两台在网络上的计算机之间的通讯接口。socket 使程序员可以像访问其他I/O 设备一样访问网络连接。在J ava 中,socket 位于网络编程的最底层。
下面,我将通过一个简单的客户端程序,一个接受socket 连接的服务器端程序两个程序来谈谈J ava 中的socket 编程。
一、SocketClient :一个简单的TCP/IP Socket 客户端1、创建SocketClient 类
这个程序中我们需要用到两个包:java.net 和java.io ,java.net 包含网络编程需要用到的一些基本的类和方法。
在java 中无论哪种I/O 设备均可使用Input Stream/Outp ut Stream 进行读/写操作。换句话说,如果需要从输入设备读,你可以使用Input Stream ;如果你需要向输出设备写,你可以使用Outp ut Stream 。这意味着通过网络读写与读写文件基本类似,基于这一点,我们需要引入java.io 包。
2、准备工作
要建立一个socket 连接,你必须获得以下信息:一是要连接到的主机。在本程序中我们的客户端和服务器端运行在同一台电脑上。我们定义一个字符串变量host ,初始化为localhost 。二是获得程序要通讯的TCP/IP 端口,服务器端可以同时提供多项网络服务,TCP/IP 使用端口来区分这些服务。如:一个服务器可同时充当web 服务器(port 80),F TP 服务器(port 21)和SM TP 邮件服务器(port 25)。端口是在服务器端指定的,客户端需要知道特定服务所使用的端口,在TCP/IP 中每一台计算机的每一个IP 地址有65,535个端口,这些端口并不是物理上的端口,而是位于TCP/IP 传送层的逻辑端口。我们定义
一个整型变量port ,在本文后面,我们将设定服务器监听于5018端口,所以初始化port 为5018。
我们还定义了其它两个变量:StringBuffer insb 用来从Input Stream 读数据,String dt 用来同服务器通讯。最后,使用System.out.println ()打印一条信息让我们知道程序开始运行。
3、请求一个Socket 并建立一个连接
要同服务器建立连接,首先必须获得服务器32位的IP 地址。我们可以调用InetAddress.getByName ()来获得IP 地址,传入参数为要连接的主机的名称,返回一个InetAddress 对象,为主机名/IP 地址对,例如:在get 2ByName ()方法中传入localhost ,则返回一个InetAddress 对象,为localhost/127.0.0.1。一旦获得了InetAddress 对象,我们就可以同服务器建立socket 连接了。定义一个Socket 变量conn ,使用InetAdress 对象和前面定义的整型变量port 我们可以创建一个Socket 对象,并将它赋给conn 。如果服务器不响应这个端口,我们会得到“ja 2va.netConnect Exception :Connection ref used :..”的信息。
连接建立后,我们向服务器写一点儿东西。首先创建一个Output Stream 对象,基于性能考虑,TCP 栈的实现一般采用带缓冲的读写,我们采用BufferedInp ut Stream 和BufferedOutput Stream 来读写数据。
4、写数据到Socket
BufferedOutp ut Stream os =new BufferedOutput 2
Stream (conn.
getOutput Stream ());
/33用可选的字符编码创建一个Outp ut Stream 2Writer 对象3/
Output StreamWriter oswriter =new Outp ut Stream 2
Writer (os ,“US -ASCII ”
);我们用BufferedOutput Stream os 和可选的字符编码
US -ASCII 来创建一个Outp ut StreamWriter 对象os 2
writer。
dt=new java.util.Date().toString();
String s=“呼叫服务器,主机:”+host+“,端口:”+port+“,时间:”+dt+char(13);
/33跨过socket连接写数据并刷新缓冲区3/
oswriter.write(s);
oswriter.flush();
如上所示,我们创建了两个String:dt和s用来向服务器写数据,调用Output StreamWriter对象中的oswrit2 er.write()方法,并将s传递给它。请注意在字符串s的末尾我们放了一个char(13),我们用这个字符告诉服务器数据发送完毕。最后刷新缓冲区,如果没有这一行,我们无法保证数据立即写入socket。
5、从Socket读数
/33创建一个BufferedInput Stream对象读取收到的socket流3/
/33用可选的字符编码创建一个Inp ut StreamRead2 er对象3/
通过调用Socket对象conn的get Input Stream()方法来创建一个Buffer Input Stream对象is,然后用Buffered2 Input Stream is和可选的字符编码US-ASCII来创建一个Input StreamReader对象isreader,接着定义一个整型变量c用来从BufferedInput Stream读字节,设计一个循环while……loop读字节并将它写入一个StringBuffer对象insb,直到碰到char(13),标识stream的结束,从sock2 et中读完数据后,关闭socket然后处理这些数据,在这个程序中我们把这些信息送到控制台。最后,编写处理异常的代码。
至此我们完成了客户端程序。
二、Socket Server:处理一个Socket的服务器
import java.net.3;
import java.io.3;
import java.util.3;
p ublic classSocket Server{
static ServerSocket socket1;
protected final static int port=5018;
static Socket conn;
static boolean first;
static StringBuffer s;
static String dt;
同设计SocketClient类一样,也要引入相同的包,创建几个变量。当然,这次我们创建的是ServerSocket类的对象socket1,用ServerSocket类来创建一个服务器。后面我们会看到,ServerSocket可监听于特定端口,接收并处理收到的socket包。根据服务器的类型我们可以选择使用Inp ut Stream和Output Stream来处理数据。
在main()方法中,我们用try…catch块作为开始,然后创建一个ServerSocket对象socket1监听5018端口,这正是我们客户端要连接的端口。最后,发送一条信息到控制台。
服务器运行以后,用while(true)…loop可以让服务器一直处于接受和处理socket连接的状态。在这个循环中,我们从socket1的accept()方法开始,accept()方法暂停程序的执行直到收到一个socket连接。当客户端连上后,我们得到一个Socket对象conn,然后继续执行后面的代码。
当连接建立起来后,用Input Stream处理来自于socket的数据,处理完收到的socket信息后,用Output2 Stream向客户端反馈一些信息,一旦Output Stream写完数据后,服务器又可以接受下一个连接了。
J ava中用socket进行网络编程是很重要的一个环节,Socket可以让两个程序跨过网络进行通讯。这里,我主要是通过两个程序剖析了J ava实现Client-Server程序的强大能力。
[参考文献]
[1]朱福喜.J ava语言与面向对象程序设计[M].武汉大学出版社.
[2]殷兆麟.J ava网络编程基础.
[3](美)Al Williams等.J ava2网络协议内幕[M].北京:中国水利水电出版社.
[4](美)Bruce Eckel.Java编程思想[M].北京:机械工业出版社.
[5](美)霍斯特曼等.J ava2核心技术[M].北京:机械工业出版社.
[6](美)史蒂文斯.J ava2网络协议内幕[M].北京:机械工业出版社.
(责任编辑:吴克峰)
In Java socket net w ork programming
CAO Hong-xia
Abstract: A Socket Processing How To.Learn to build a simple socket client and a socket server t hat handles socket connection.
K ey w ords: socket;client;server
041下载本文