服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java中c/s通讯程序设计一例


  一、 客户端图形界面

  本例中客户端的图形界面用swing实现,服务器端不使用图形界面

public class javaclient extends jframe implements actionlistener//以jframe为基类,实现actionlistener接口
{
jbutton sendbutton; //"发送"按钮
jtextfield inputfield; // 输入框
jtextarea outputaera; // 服务器返回框
public javaclient() //在建构函数中完成图形界面的初始化
{
inputfield=new jtextfield("这里输入..."); //供客户端输入的文本框
outputarea=new jtextarea("服务器返回"); //显示服务器返回数据的文本域
sendbutton=new jbutton("发送");
jpanel panel=new jpanel(); //新建面板
panel.setlayout(new borderlayout()); //设置面板风格为borderlayout
panel.add(inputfield,borderlayout.north); //放置控件
panel.add(outputarea,borderlayout.center);
settitle("java通讯客户端");
setcontentpane(panel);
}
}


  二、 客户端通讯类clientagent

  新建一个自定义包clientagent,包含类clientagent,该类用来执行和服务器端的交互,将界面和通讯类分开可以使程序的调试和维护更为容易。clientagent类的作用包括:

  1、在建构函数中建立和服务器的连接。

  2、sendrequest()方法向服务器发送数据。

  3、getresponse()方法从服务器端获得回应

  1、 成员变量

clientagent类的成员变量包括:
printstream ops; //输出流(指向服务器)
datainputstream ips;//输入流(来自服务器)
string cltrequest;//客户端请求
string svrresponse;//服务器端回应

  2、 建构函数clientagent(string servername,int port)包含两个参数,接收从javaclient的main()函数中传递来的服务器名称和端口号

public clientagent(string servername,int port)
{
try
{
socket clientsocket=new socket(servername,port ); //根据服务器名和端口号建立socket
ops=new printstream(clientsocket.getoutputstream());//获得socket的输出流
ips=new datainputstream(clientsocket.getinputstream());//获得socket的输入流
}
catch(exception e)
{
system.out.println("无法连接服务器!");
}
}

  3、 sendrequest()方法

public void sendrequest(string request)
{
ops.println(request); //向socket的输出流写入字符串
}
4、 getrespone()方法
public string getresponse()
{
string str=new string();
try
{
str=ips.readline(); //从socket的输入流读入字符串
}
catch(ioexception e){} //必须捕获错误
return str;
}

  三、 客户端javaclient类的main()函数和事件处理

  1、 main()函数

  有了上面的铺垫,main()函数变得非常简洁

public static void main(string[] args)
{
javaclient frame=new javaclient();
frame.pack();//注意javaclient是jframe的派生类,调用基类方法
frame.setvisible(true);
ca=new clientagent("127.0.0.1",1001); //传递服务器名称和端口号
}

  2、 捕获并处理单击"发送"按钮的事件

public void actionperformed(actionevent e)
{
if(e.getsource()==sendbutton) //判断事件源控件是否是"发送"按钮
{
ca.sendrequest(inputfield.gettext()); //发送文本框中的文本
outputarea.append("/n"+ca.getresponse()); //接收服务器回应并写入文本域
}
}



  四、 服务器端

  1、 serveragent类

  1) 成员变量

serversocket svrskt=null;
socket cltskt=null;
datainputstream input=null; //输入流,来自客户端
printstream output=null; //输出流,指向客户端

  2) serveragent()建构函数

public serveragent(int port) //main()函数传递监听端口号
{
system.out.println("服务器代理正在监听,端口:"+port);
try
{
svrskt=new serversocket(port); //开始监听
}catch(ioexception e){system.out.println("监听端口"+port+"失败");}
try
{
cltskt=svrskt.accept(); //接收连接请求
}
catch(ioexception e){system.out.println("连接失败");}
try
{
input=new datainputstream(cltskt.getinputstream()); //获得输入流
output=new printstream(cltskt.getoutputstream()); //获得输出流
}
catch(ioexception e){}
output.println("欢迎......");
}
3) getrequest()方法读取客户端发送的数据
public string getrequest()
{
string frmclt=null;
try
{
frmclt=input.readline();
}
catch(exception e){
system.out.println("无法读取端口.....");
system.exit(0);
}
return frmclt;
}

  4) sendresponse()方法向客户端发送数据

public void sendresponse(string response)
{
try
{
output.println(response);
}
catch(exception e){
system.out.println("写端口失败......");
system.exit(0);
}
}

  2、main()函数

  在main()函数中对客户端发送的不同请求进行不同的处理,本例只是介绍原理,因此服务器端只是简单地将客户端发送来的数据发送回去:

public static void main(string[] args) throws ioexception
{
serveragent sa=new serveragent(1001);
while(true)
{
sa.sendresponse(sa.getrequest());
}
}

扫描关注微信公众号