姚晓芳,舒小松
(铜仁学院 大数据学院,贵州 铜仁 554300)
基于Java Socket网络编程的基础性应用研究
姚晓芳,舒小松
(铜仁学院 大数据学院,贵州 铜仁 554300)
Java Socket(套接字)是Java网络编程的核心内容之一,使用Java编写的相关应用程序通常通过"套接字"向网络发出请求或者应答网络请求.Socket是两台主机之间的一个连接,通过这个连接可以实现主机到服务器之间的数据传递与数据交流,具有数据传输时间短、效率高等特点.文章通过一个详细的案例介绍了Socket在Java平台中的基础性应用,并进行了相关的分析.
Java Socket;网络编程;基础性应用
Java是一门面向对象编程的开发语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有安全、跨平台、面向对象、简单、适用于网络等显著特点[1].Java由JDK,JRE,JVM以及第三方JAR包组成.
Java Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄[2].网络上两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket主要由一个IP地址和一个端口号来确定.在Java中Socket编程主要指基于TCP/IP协议的网络编程.好比打电话需要有电话或手机,套接字就是手机.主动打的一方,就叫主叫方,对方就是被叫方.那么主叫方需要一个Socket,被叫方需要一个Server Socket.被叫方有多个号.他得选中一个号工作,这叫绑定.在套接字上,是绑定到端口.被叫方需要开机才能接听电话,那他就得先侦听.Server Socket的accept()就是开始侦听,并有来电时接听.本文通过基于Java Socket网络编程的基础性应用研究,编写一个客户端/服务器程序.
安装好JDK以及Eclipse软件.进入Eclipse,编写相关Java源程序.
2.2.1 开启客户端Socket
(1)需要创建一个host.
String host1 = "127.0.0.1"
(2)需要创建一个端口.
int port1 = 9999
(3)创建client对象.
Socket client1 = new Socket(host,port)
上述代码中,host即是客户端需要连接的机器,port就是服务器用来监听的端口.要注意选择端口的范围,在系统中,小于1 024的端口都基本上被占用了.这些端口为一些常用的服务所使用,比如电子邮件,FTP,HTTP,TELNET等.编写服务器端的代码时候,需要选择大于1 023的端口.
2.2.2 写入数据
从客户端的socket对象中得到OutputStream对象,然后写入数据后.很类似文件I/O的处理代码.
(1)通过字符流接收服务器端读入的流.
Writer writer1 = new OutputStreamwriter(client.getOutputstream())
(2)读入数据.
Writer.write("Hello Java From Client")
(3)刷新、关闭.
writer1.flush()
writer1.close()
client1.close()
注意用Socket类的时候需要加入抛出异常,在读写数据完成后,需要对IO对象进行关闭,以保证资源的正确释放.Writer类是一个写入字符流的抽象类.这种累的子类必须实现的方法是通过write(char [],int,int)方法读取和flush()刷新,close()方法关闭;OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即:将一个字符流的输出对象变为字节流的输出对象;getOutputStream方法获得输出流和输入流,输出流就是向这个Socket通道写数据,输入流就是从里面读数据.输入和输出是相对于端来说的,Socket可以简单看作端和端之间的连接,从某一端发出数据到Socket,就是out,某一端从Socket读取数据,就是in.其客户端代码如图1所示.
2.3.1 开启服务器端Socket
(1)需要创建一个端口,该端口与客户端一致.
int port1 = 9999
(2)创建server对象
ServerSocket server1 = new ServerSocket(port)
(3)监听
Socket socket1 = server.accept()
上面代码的作用是为了创建一个服务器端的Socket,然后调用accept方法监听获取客户端的请求Socket.这个accept是一种阻塞形式的IO和监听端口方法.如果有数据过来会唤醒此方法,内部用的wait(),notity().
图1 客户端代码
2.3.2 读取数据
Reader reader1 = new InputStreamReader(socket.getInputStream())
2.3.3 输出数据
System.out.println("Receive from client message"+builder)
最后仍然需要正确关闭IO对象,以确保资源的正确释放.抽象类Reader读取字符流的抽象类.这种类的子类必须实现的方法是通过read(char [],int,int)方法读取和close()方法关闭.然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率、附加功能或两者一起使用.这里用的是StringBuilder而没有用StringBuffer,是因为Stringbuilder如果用在字符串缓冲区中,并且能够被单个显存使用的时候,它的速度比StringBuffer要快.其服务器端代码如图2所示.
先在服务器端运行程序,然后在客户端运行程序将会显示如图3所示的效果,表明程序成功.如果在服务器端控制台输入数据,将会反馈给客户端,如图4-5所示.
图2 服务器端代码
图3 结论
图4 服务器端输入数据
图5 客户端显示数据
通过Java Socket网络编程的基础性应用与研究,使我们对Java Socket网络编程有了新的认识,为今后Java Socket网络编程的学习打下坚实的基础.
[1]李芝新,杨瑞龙.Java程序设计之网络编程[M].北京:清华大学出版社,2009.
[2]马晓敏,肖明,姜远明,等.Java网络编程原理与JSP Web开发核心技术[M].北京:中国铁道出版社,2010.
Study on the basic application of network programming based on Java Socket
Yao Xiaofang, Shu Xiaosong
(Large Data College of Tongren University, Tongren 554300, China)
Java Socket is one of the core elements of Java network programming. Relevant applications program written by Java usually send requests to the network or answer network requests through "Sockets". Socket is a connection between two hosts. Through this connection,data transfer and data exchange between host and server can be realized. It has the characteristics of short data transmission time and high efficiency. This paper introduces the basic application of Socket in Java platform through a detailed case, and carries on the related analysis.
Java Socket; network programming; basic application
姚晓芳(1979- ),女,贵州铜仁人,讲师,学士;研究方向:微机原理与接口技术,单片机,数据库等.