这是从另一个论坛的代码修改的,原来有很多错误,我已经修改,供大家欣赏!
这中间还用到了设计模式中的代理模式,还有一些jframe入门的东西
1 客户端
public class javaclient extends jframe implements actionlistener//以jframe为基类,实现actionlistener接口
{
jbutton sendbutton; //"发送"按钮
jtextfield inputfield; // 输入框
jtextarea outputarea; // 服务器返回框
static clientagent ca;
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);
panel.add(sendbutton,borderlayout.page_end);
sendbutton.addactionlistener(this);
settitle("java通讯客户端");
setcontentpane(panel);
}
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); //传递服务器名称和端口号
}
public void actionperformed(actionevent ae)
{
if(ae.getsource()==sendbutton) //判断事件源控件是否是"发送"按钮
{
try
{
ca.sendrequest(inputfield.gettext()); //发送文本框中的文本
system.out.println("send:"+inputfield.gettext());
}catch(exception ex)
{
ex.printstacktrace();
}
outputarea.append("/n"+ca.getresponse()); //接收服务器回应并写入文本域
}
}
}
2客户代理端
import java.io.*;
import java.net.*;
/**
* @author administrator
*
* todo to change the template for this generated type comment go to
* window - preferences - java - code style - code templates
*/
public class clientagent {
printstream ops; //输出流(指向服务器)
datainputstream ips;//输入流(来自服务器)
bufferedreader bf;
string cltrequest;//客户端请求
string svrresponse;//服务器端回应
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的输入流
bf = new bufferedreader(new inputstreamreader(clientsocket.getinputstream()));
}
catch(exception e)
{
system.out.println("无法连接服务器!");
}
}
public void sendrequest(string request)
{
ops.println(request); //向socket的输出流写入字符串
}
public string getresponse()
{
string str=new string();
try
{
//str=ips.readline(); //从socket的输入流读入字符串
str = bf.readline();
system.out.println("服务器返回:"+str);
}
catch(ioexception e){} //必须捕获错误
return str;
}
}
3 服务器端
import java.io.*;
import java.net.*;
/**
* @author administrator
*
* todo to change the template for this generated type comment go to
* window - preferences - java - code style - code templates
*/
public class serveragent {
serversocket svrskt=null;
socket cltskt=null;
//datainputstream input=null; //输入流,来自客户端
bufferedreader inf=null;
printstream output=null; //输出流,指向客户端
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()); //获得输入流
inf = new bufferedreader(new inputstreamreader(cltskt.getinputstream()));
output=new printstream(cltskt.getoutputstream()); //获得输出流
}
catch(ioexception e){}
output.println("欢迎......");
}
public string getrequest()
{
system.out.println("server getrequest");
string frmclt=null;
try
{
//frmclt=input.readline();
frmclt = inf.readline();
system.out.println("after server getrequest:"+frmclt);
}
catch(exception e){
system.out.println("无法读取端口.....");
system.exit(0);
}
return frmclt;
}
public void sendresponse(string response)
{
system.out.println("server sendresponse");
try
{
output.println(response);
}
catch(exception e){
system.out.println("写端口失败......");
system.exit(0);
}
}
public static void main(string[] args) throws ioexception
{
serveragent sa=new serveragent(1001);
while(true)
{
sa.sendresponse(sa.getrequest());
}
}
}
闽公网安备 35060202000074号