科技信息
0.引言
Java 语言已经成为 Internet 上最为流行的编程语言,它之所以适合
编写网络应用程序主要归功于它的以下优势
。第一,Java 语言的平台无
关性使得它能够运行在各种不同的平台上,这些运行在不同平台的 Ja-
va
程序能够方便的进行网络通信。第二,Java 语言的安全性使得可以对
程序进行权限检查,这对网络程序非常重要。第三,JDK 类库提供了丰
富的网络类库,能够简化网络程序的开发过程。套接字(Socket)是 Java
网络编程的基础,本文主要介绍 Socket 通信的基本原理,然后在这些原
理的基础上,用 Java 实现了一个多用户网上聊天系统。
1.充分理解 Socket
所谓 socket 通常也称作“套接字”,用于描述 IP 地址和端口,是一
个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应
答网络请求。
在 C/S 模式中,客户端需要主动创建与服务器连接的 Socket,服
务器端收到客户端的连接请求后,也会创建与客户端连接的 Socket。
Socket 可以看做是通信连接两端的收发器,服务器和客户端都通过
Socket 来收发数据。
在 JDK 中,Socket 和 ServerSocket 是实现 Socket 通信的主要工具,
创建一个 ServerSocket 对象就创建了一个监听服务,创建一个 Socket 对
象就建立了一个服务器与客户端之间的连接。这两个类位于 java.net 包
中
。ServerSocket 用于服务器端,Socket 是建立网络连接时使用的。在连
接成功时,应用程序两端都会产生一个 Socket 实例,操作这个实例,可
以完成所需的会话。
java.net.Socket 继承于 java.lang.Object,它的方法不多,下面介绍使
用最频繁的三个方法:
accept 方法用于产生“阻塞”,直到接受到一个连接,并且返回一个
客户端的 Socket 对象实例。“阻塞”的含义是指使程序运行暂时“停留”
在这个地方,直到一个会话产生,然后程序继续;通常“阻塞”是由循环
产生的。
getInputStream 方法获得网络连接输入,同时返回一个 IutputStream
对象实例。
getOutputStream 方法连接的另一端将得到输入,同时返回一个
OutputStream 对象实例。
由 getInputStream 和 getOutputStream 方法返回的流对象,通常都会
被另一个流对象使用以完成服务器和客户端之间的通信
。另外这两个
方法均会产生一个 IOException,它必须被捕获。
2.开发 C/S 模式程序
2.1 服务器实现:服务器使用 ServerSocket 监听指定的端口,端口可
以随意指定(由于 1024 以下的端口通常属于保留端口,在一些操作系
统中不可以随意使用,所以建议使用大于 1024 的端口),等待客户连接
请求,客户连接后,会话产生;在完成会话后,关闭连接。
服务器示例代码:
public class ServerCode {
private int port=8000;
private ServerSocket serverSocket;
public ServerCode()throws IOException{
serverSocket = new ServerSocket(port);}
public void service(){
while(true){
Socket socket = null;
try{ socket = serverSocket.accept();
BufferedReader br =new BufferedReader(new InputStreamReader(sock-
et.getInputStream()));
PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
String msg = null;
while((msg = br.readLine())!= null){
pw.println("your say:"+msg);
if(msg.equals("bye")){
break;} } }
catch(IOException e){e.printStackTrace();}
finally{ try{ if(socket != null){socket.close(); }}
catch(IOException e){ e.printStackTrace(); }}}
2.2
客户端实现:客户端使用 Socket 对网络上某一个服务器的某一
个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭
Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个
1024 以上的端口。
客户端示例代码:
public class ClientCode {
private String host="localhost";
private int port=8000;
private Socket socket;
public ClientCode()throws IOException{
socket = new Socket(host,port); }
public void talk()throws IOException{
try{
BufferedReader br =new BufferedReader(new InputStreamReader(sock-
et.getInputStream()));
PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
BufferedReader localReader = new BufferedReader (new InputStream-
Reader(System.in));
String msg = null;
while((msg = localReader.readLine())!= null){
pw.println(msg);
System.out.println(br.readLine());
if(msg.equals("bye")){
break;}}}
catch(IOException e){e.printStackTrace();}
finally{try{socket.close();}
catch(IOException e){e.printStackTrace();}}}}
3.使用多线程实现多客户端
在实际的网络环境里,同一时间只对一个用户服务是不可行的。一
个优秀的网络服务程序必须能够同时响应多个客户端的连接请求。在
Java 中,可以很方便的通过多线程机制的实现以上功能。具体就是将服
务器端代码进行一下修改,将监听端口的任务交给 CreateServerThread
线程运行。
CreateServerThread 的代码如下:
class CreateServerThread extends Thread{
private Socket socket;
private BufferedReader br;
private PrintWriter pw;
public CreateServerThread(Socket s) throws IOException{
socket = s;
br = new BufferedReader(new InputStreamReader(socket.getInputStream
()));
pw = newPrintWriter(socket.getOutputStream(),true);
start();}
public void run(){
try{String msg = null;
浅谈 Java Socket 网络编程
鹤壁职业技术学院电子系 李 伟 刘鹏飞
[摘 要]本文介绍了 Socket 的通信机制,并通过使用 Socket 来创建一个简单的 Java 服务器 / 客户机程序,详细介绍 Socket 实现
C/S 模式的网络通信的步骤和方法。
[关键词]Java Socket 网络通信
计算机与网络
226
— —