Java编程实现基于TCP协议的Socket聊天室示例
本文实例讲述了Java编程实现基于TCP协议的Socket聊天室。分享给大家供大家参考,具体如下:
这里使用Socket套接字进行编程,完成的是基于TCP可靠服务实现服务器与客户端的双通信。
Server服务器端:
packagecom.han;
importjava.awt.Container;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.io.*;
importjava.net.*;
importjavax.swing.JDialog;
importjavax.swing.JScrollPane;
importjavax.swing.JTextArea;
importjavax.swing.JTextField;
/**
*本程序实现了一个TCP程序的服务器编程部分。
*使用Socket套接字进行编程,完成的是基于TCP可靠服务实现与客户端的双通信。
*客户端的编程见本包中的类Client
*@authorHAN
*
*/
@SuppressWarnings("serial")
publicclassServerextendsJDialog{
privateBufferedReaderreader;
privatePrintWriterwriter;
privateServerSocketserver;
privateSocketsocket;
privateJTextAreata=newJTextArea();
privateJScrollPanesp=newJScrollPane(ta);
privateJTextFieldtf=newJTextField();
Containercc;
publicServer(Stringtitle){
setTitle(title);
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEventwe){
dispose();//撤销dialog一切相关资源
System.exit(0);//正常退出程序
}
});
cc=getContentPane();
setLayout(null);
ta.setLineWrap(true);
ta.setEditable(false);
sp.setBounds(0,0,300,342);
tf.setBounds(0,342,300,25);
cc.add(sp);
cc.add(tf);
tf.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
try{
writer=newPrintWriter(socket.getOutputStream(),true);
}catch(IOExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
writer.println(tf.getText());
ta.append("User1:"+tf.getText()+'\n');
tf.setText("");
}
});
}
voidgetserver(){
try{
server=newServerSocket(8998);
ta.append("服务器套接字已经创建成功\n");
while(true){
ta.append("等待客户机的连接\n");
socket=server.accept();
ta.append("客户机已连接\n");
reader=newBufferedReader(newInputStreamReader(socket.getInputStream()));
getClientMessage();
}
}catch(Exceptione){
e.printStackTrace();
}
}
privatevoidgetClientMessage(){
try{
while(true){
Stringnews=reader.readLine();
if(news!=null){
ta.append("User2:"+news+"\n");
}else{
ta.append("User2(客户端)已断开链接\n");
break;
}
}
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
try{
if(reader!=null){
reader.close();
}
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
if(socket!=null){
try{
socket.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
publicstaticvoidmain(String[]args){
Serveruser1=newServer("User1");
user1.setBounds(0,0,300,400);
user1.setResizable(false);
user1.setVisible(true);
user1.getserver();
}
}
Client客户端:
packagecom.han;
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
importjava.net.*;
importjavax.swing.*;
/**
*本程序实现了一个TCP程序的客户端编程部分。
*使用Socket套接字进行编程,完成的是基于TCP可靠服务实现与服务器的双通信。
*服务器的编程见本包中的类Server
*可以在不同的平台与不同的机器上运行,只是要把代码中写的IP地址修改为运行服务器程序Server的机器的IP地址。
*@authorHAN
*
*/
@SuppressWarnings("serial")
publicclassClientextendsJDialog{
privateBufferedReaderreader;
privatePrintWriterwriter;
privateSocketsocket;
privateJTextAreata=newJTextArea();
privateJScrollPanesp=newJScrollPane(ta);
privateJTextFieldtf=newJTextField();
Containercc;
publicClient(Stringtitle){
setTitle(title);
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEventwe){
dispose();//撤销dialog一切相关资源
System.exit(0);//正常退出程序
}
});
cc=getContentPane();
setLayout(null);
ta.setLineWrap(true);
ta.setEditable(false);
sp.setBounds(0,0,300,342);
tf.setBounds(0,342,300,25);
cc.add(sp);
cc.add(tf);
tf.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
writer.println(tf.getText());
ta.append("User2:"+tf.getText()+'\n');
tf.setText("");
}
});
}
privatevoidconnect(){
ta.append("尝试连接\n");
try{
socket=newSocket("192.168.1.3",8998);
}catch(UnknownHostExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
try{
writer=newPrintWriter(socket.getOutputStream(),true);
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
ta.append("完成连接\n");
}
privatevoidgetClientMessage(){
try{
reader=newBufferedReader(newInputStreamReader(socket.getInputStream()));
while(true){
Stringnews=reader.readLine();
if(news!=null){
ta.append("User1:"+news+"\n");
}else{
ta.append("User1(服务器)已断开链接,等待服务器重连之时,重启User2(客户端)进行通信\n");
break;
}
}
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
ta.append("User1(服务器)已断开链接,等待服务器重连之时,重启User2(客户端)进行通信\n");
e.printStackTrace();
}
try{
if(reader!=null){
reader.close();
}
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
if(socket!=null){
try{
socket.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
publicstaticvoidmain(String[]args){
Clientuser2=newClient("User2");
user2.setBounds(0,0,300,400);
user2.setVisible(true);
user2.setResizable(false);
user2.connect();
user2.getClientMessage();
}
}
更多关于java相关内容感兴趣的读者可查看本站专题:《JavaSocket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。