视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Java中的socket网络编程
2025-09-29 22:33:14 责编:小OO
文档
第23卷 第1期2006年1月

     

湖北广播电视大学学报

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下载本文

显示全文
专题