基于Java Socket实现一个简易在线聊天功能(一)
最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到毛票票平台,以此做个记录,方便自己和大家使用。
先给大家说下实现步骤分这样几大步:
1、使用awt组件和socket实现简单的单客户端向服务端持续发送消息;
2、结合线程,实现多客户端连接服务端发送消息;
3、实现服务端转发客户端消息至所有客户端,同时在客户端显示;
4、把awt组件生成的窗口界面改成前端jsp或者html展示的界面,javasocket实现的客户端改为前端技术实现。
这里首先实现第一步的简单功能,难点在于:
1、没有用过awt组件,没有用过java相关的监听事件;
2、长时间没有使用socket进行客户端和服务端的交互,并且没有真正进行过cs结构的开发。
实现功能的代码如下:
客户端:
packagechat.chat;
importjava.awt.BorderLayout;
importjava.awt.Frame;
importjava.awt.TextArea;
importjava.awt.TextField;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.net.Socket;
importjava.net.UnknownHostException;
/**
*在线聊天客户端1、生成图形窗口界面轮廓2、为轮廓添加关闭事件3、在轮廓中加入输入区域和内容展示区域4、为输入区域添加回车事件
*5、建立服务端连接并发送数据
*
*@authortuzongxun123
*
*/
publicclassChatClientextendsFrame{
//用户输入区域
privateTextFieldtfTxt=newTextField();
//内容展示区域
privateTextAreatarea=newTextArea();
privateSocketsocket=null;
//数据输出流
privateDataOutputStreamdataOutputStream=null;
publicstaticvoidmain(String[]args){
newChatClient().launcFrame();
}
/**
*建立一个简单的图形化窗口
*
*@author:tuzongxun
*@Title:launcFrame
*@param
*@returnvoid
*@dateMay18,20169:57:00AM
*@throws
*/
publicvoidlauncFrame(){
setLocation(300,200);
this.setSize(200,400);
add(tfTxt,BorderLayout.SOUTH);
add(tarea,BorderLayout.NORTH);
pack();
//监听图形界面窗口的关闭事件
this.addWindowListener(newWindowAdapter(){
@Override
publicvoidwindowClosing(WindowEvente){
System.exit(0);
disConnect();
}
});
tfTxt.addActionListener(newTFLister());
setVisible(true);
connect();
}
/**
*连接服务器
*
*@author:tuzongxun
*@Title:connect
*@param
*@returnvoid
*@dateMay18,20169:56:49AM
*@throws
*/
publicvoidconnect(){
try{
//新建服务端连接
socket=newSocket("127.0.0.1",8888);
//获取客户端输出流
dataOutputStream=newDataOutputStream(socket.getOutputStream());
System.out.println("连上服务端");
}catch(UnknownHostExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
/**
*关闭客户端资源
*
*@author:tuzongxun
*@Title:disConnect
*@param
*@returnvoid
*@dateMay18,20169:57:46AM
*@throws
*/
publicvoiddisConnect(){
try{
dataOutputStream.close();
socket.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
/**
*向服务端发送消息
*
*@author:tuzongxun
*@Title:sendMessage
*@param@paramtext
*@returnvoid
*@dateMay18,20169:57:56AM
*@throws
*/
privatevoidsendMessage(Stringtext){
try{
dataOutputStream.writeUTF(text);
dataOutputStream.flush();
}catch(IOExceptione1){
e1.printStackTrace();
}
}
/**
*图形窗口输入区域监听回车事件
*
*@authortuzongxun123
*
*/
privateclassTFListerimplementsActionListener{
@Override
publicvoidactionPerformed(ActionEvente){
Stringtext=tfTxt.getText().trim();
tarea.setText(text);
tfTxt.setText("");
//回车后发送数据到服务器
sendMessage(text);
}
}
}
服务端:
packagechat.chat;
importjava.io.DataInputStream;
importjava.io.EOFException;
importjava.io.IOException;
importjava.net.BindException;
importjava.net.ServerSocket;
importjava.net.Socket;
/**
*java使用socket和awt组件简单实现在线聊天功能服务端可以实现一个客户端连接后不断向服务端发送消息
*但不支持多个客户端同时连接,原因在于代码中获得客户端连接后会一直循环监听客户端输入,造成阻塞
*以至于服务端无法二次监听另外的客户端,如要实现,需要使用异步或者多线程
*
*@authortuzongxun123
*
*/
publicclassChatServer{
publicstaticvoidmain(String[]args){
//是否成功启动服务端
booleanisStart=false;
//服务端socket
ServerSocketss=null;
//客户端socket
Socketsocket=null;
//服务端读取客户端数据输入流
DataInputStreamdataInputStream=null;
try{
//启动服务器
ss=newServerSocket(8888);
}catch(BindExceptione){
System.out.println("端口已在使用中");
//关闭程序
System.exit(0);
}catch(Exceptione){
e.printStackTrace();
}
try{
isStart=true;
while(isStart){
booleanisConnect=false;
//启动监听
socket=ss.accept();
System.out.println("oneclientconnect");
isConnect=true;
while(isConnect){
//获取客户端输入流
dataInputStream=newDataInputStream(
socket.getInputStream());
//读取客户端传递的数据
Stringmessage=dataInputStream.readUTF();
System.out.println("客户端说:"+message);
}
}
}catch(EOFExceptione){
System.out.println("clientclosed!");
}catch(Exceptione){
e.printStackTrace();
}finally{
//关闭相关资源
try{
dataInputStream.close();
socket.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
以上所述是小编给大家介绍的JavaSocket实现一个简易在线聊天功能(一)的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!