APP下载

JAVA语言SOCKET机制的研究

2011-04-08谢智明

湖南科技学院学报 2011年4期
关键词:服务器端链路客户端

谢智明

(湖南科技学院 计算机与通信工程系,湖南 永州 425100)

JAVA语言SOCKET机制的研究

谢智明

(湖南科技学院 计算机与通信工程系,湖南 永州 425100)

本文研究了JAVA语言SOCKET机制,阐述了输入/输出流的概念,并应用这一机制实现了C/S模式下网络通信。

JAVA;网络;SOCKET

1 Socket 机制

Socket是面向客户/服务器模型设计的,网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。 Socket通常用来实现客户方和服

务方的连接。客户程序可以向 Socket写请求,服务器将处理此请求,然后通过Socket将结果返回给用户。

Socket通信机制提供了两种通讯方式:有联接和无联接方式,分别面向不同的应用需求。使用有联接方式时,通信链路提供了可靠的,全双工的字节流服务。在该方式下,通信双方必须创建一个联接过程并建立一条通讯链路,以后的网络通信操作完全在这一对进程之间进行,通信完毕关闭此联接过程。使用无联接方式时其系统开销比无联接方式小,但通信链路提供了不可靠的数据报服务,不能保证信源所传输的数据一定能够到达信宿。在该方式下,通信双方不必创建一个联接过程和建立一条通讯链路,网络通信操作在不同的主机和进程之间转发进行。

2 Java中输入/输出流概念

过滤流DataInputStream 和DataOutputStream 除了分别作为 FilterInputStream 和 FilterOutputStream的子类外,还分别实现了接口DataInput 和DataOutput。接口DataInput 中定义的方法,主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数,如 readBoolean()readInt()、readLine()、readFully()等。

接口 DataOutput中定义的方法主要是向流中写入基本类型的数据或者写入一定长度的字节数组,如writeChar()、writeDouble() DataInputStream可以从所连接的输入流中读取与机器无关的基本类型数据,用以实现一种独立于具体平台的输入方式;DataInputStream 可以向所连接的输出流写入基本类型的数据。

3 客户机/服务器通信的实现

3.1 客户端的编程流程:

1、打开Socket,新建一个套接字;

2、为套接字建立一个输入和输出流;

3、根据服务器协议从套接字读入或向套接字写入;

4、清除套接字和输入/输出流;

3.2 服务器端的编程流程:

1、打开Server Socket,创建一个服务器型套接字和一个普通套接字,服务器型套接字在指定端口为客户端请求的Socket 服务;

2、使用ServerSocket类的accept()方法使服务器型套接字处于监听状态并把监听结果返回给普通套接字;

3、为该普通套接字创建输入和输出流;

4、从输入和输出流中读入或写入字节流,进行相应的处理,并将结果返回给客户端;

5、在客户端和服务器工作结束后关闭所有的对象,如服务器型的套接字,普通套接字,输入和输出流。

正是由于Java系统具有基于Socket的灵活通信机制,因而其应用程序能自由地打开和访问网络上的对象,就象在本地文件系统中一样。

4 程序代码清单

服务器端程序负责与客户端通信import java.io.*;

import java.net.*;

import java.lang.*;

import T2;

class ThreadEchoHandler extends Thread //创建线程

{

T2 theT2=new T2();

Socket incoming;

int counter;

ThreadEchoHandler(Socket i,int c)

{ incoming=i;

counter=c; }

public void run()

{ try

{

DataInputStream in=new

DataInputStream(incoming.getInputStream());

DataOutputStream out=new

DataOutputStream(incoming.get Out put Stream());

System.out.println ("hello");

boolean done=false;

while(!done)

{ String aa="";

String str=in.readUTF();

//从客户端得到字符串

//在此加入各自的服务程序

System.out.println (str);

theT2.pass(str); //解码

theT2.tongji();

//修改监控库中的信息

aa=theT2.guan();

//操纵数据库

System.out.println ("string z is:"+aa);

if(aa.compareTo("null")!=0 )//若是查询数据库,返回查询后的结果

{

//若不是查询数据库,不向客户端输出信息

out.writeUTF(aa);

out.flush(); }

}//while

incoming.close(); //线程关闭

}//try

catch(IOException e)

{System.out.println(e);}

}//end run

}

//----------------------------------------

class S

{

public static void main(String[] args)

{

int i=1;

try

{

ServerSocket s=new ServerSocket(1111);

for(;;)

{

Socket incoming=s.accept();

System.out.println("connect: "+i);

new

ThreadEchoHandler(incoming,i).start();

i++;

}

}

catch(Exception e)

{ System.out.println(e); }

}

}

客户端通信应用程序 Echo.java

import java.io.*;

import java.net.*;

import java.awt.*;

import java.applet.*;

public class Echo extends Applet

{

TextArea ta;

Socket echoSocket;

DataOutputStream os;

DataInputStream is;

String Line;

public void init()

{

setBackground(Color.white);

ta=new TextArea(5,80);

ta.setEditable(false);

add(ta);

try

{echoSocket=new Socket("10.102.4.41",1111);}

//与服务器建立连接

catch(IOException e)

{System.out.println("error");}

}

public void st(String stri) //发送字符串的 方法

{

try

{ DataOutputStream os=new

DataOutputStream(echoSocket.getOutputStream());

DataInputStream is=new

DataInputStream(echoSocket.getInputStream());

os.writeUTF(""+ stri );

//向服务器输送string

os.flush();

}

catch(IOException e)

{System.out.println(" error:"+e); }

}

public String st1() //接收字符串的方法

{

String Line="";

try

{ DataOutputStream os=new

DataOutputStream(echoSocket.getOutputStream());

DataInputStream is=new

DataInputStream(echoSocket.getInputStream());

Line=is.readUTF();

//从服务器读来的信息

ta.appendText(""+Line);

//在文本域中输出信息

}

catch(IOException e)

{System.out.println(" error:"+e); }

return Line;

}

}

5 研究小结

在建立 Socket连接时,两端的端口号必须设为一致,否则建立不了连接。服务器端必须有主机IP地址或主机名参数。连接建立好之后应确定输入和输出流。起初程序中用的是DataInputStream和PrintStream,结果只能传输英文 ,传输中文时产生乱码,将PrintStream改为DataOutput Stream,使用readUTF()和writeUTF()方法后,中文传输问题得到解决。如果一个使用某端口的程序没有关闭,另一个程序就不能使用这个端口。

[1]廖雷,等.Java程序设计教程[M].北京:中国电力出版社,2003.

[2]张立,等.基于Client/Server模式的数据库应用软件的设计与实现[J].计算机应用研究,1999,(4).

TP311

A

1673-2219(2011)04-0070-03

2010-4-29

谢智明(1971-),湖南祁阳人,硕士,计算机软件与技术系统分析师,研究方向为计算机及应用。

(责任编校:何俊华)

猜你喜欢

服务器端链路客户端
天空地一体化网络多中继链路自适应调度技术
Linux环境下基于Socket的数据传输软件设计
如何看待传统媒体新闻客户端的“断舍离”?
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
浅析异步通信层的架构在ASP.NET 程序中的应用
基于Qt的安全即时通讯软件服务器端设计
基于数据包分割的多网络链路分流系统及方法
基于3G的VPDN技术在高速公路备份链路中的应用
高速光纤链路通信HSSL的设计与实现