本文实例为大家分享了 Java 实现简单 局域网 聊天室 的具体代码,供大家参考,具体内容如下
Java 的Socket编程:
1、TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低
2、Java中基于TCP协议实现网络通信的类
客户端的Socket类 服务器端的ServerSocket类
3、Socket通信的步骤
① 创建ServerSocket和Socket
② 打开连接到Socket的输入/输出流
③ 按照协议对Socket进行读/写操作
④ 关闭输入输出流、关闭Socket
4、服务器端:
① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求
③ 连接建立后,通过输入流读取客户端发送的请求信息
④ 通过输出流向客户端发送乡音信息
⑤ 关闭相关资源
5、客户端:
① 创建Socket对象,指明需要连接的服务器的地址和端口号
② 连接建立后,通过输出流想服务器端发送请求信息
③ 通过输入流获取服务器响应的信息
④ 关闭响应资源
实现的聊天室例子:
实现的效果是如下:
服务端代码:
package socket . server ; import java . io . BufferedReader ; import java . io . IOException ; import java . io . PrintWriter ; import java . net . ServerSocket ; import java . net . Socket ; import java . util . ArrayList ; /** * @author 超 * Create by fengc on 2018/7/25 21:21 */ public class Server extends Thread { ServerUI ui ; ServerSocket ss ; BufferedReader reader ; PrintWriter writer ; public Server ( ServerUI ui ) { this . ui = ui ; this . start (); } @Override public void run () { try { ss = new ServerSocket ( 8081 ); ui . clients = new ArrayList <>(); println ( "启动服务器成功:端口8081" ); while ( true ) { println ( "等待客户端链接......................................." ); Socket client = ss . accept (); ui . clients . add ( client ); println ( "连接成功,客户端请求服务端的详细信息:" + client . toString ()); new ListenerClient ( ui , client ); } } catch ( IOException e ) { println ( "启动服务器失败:端口8081" ); println ( e . toString ()); e . printStackTrace (); } } public synchronized void sendMsg ( String msg ) { try { for ( int i = 0 ; i < ui . clients . size (); i ++) { Socket client = ui . clients . get ( i ); writer = new PrintWriter ( client . getOutputStream (), true ); writer . println ( msg ); } } catch ( Exception e ) { println ( e . toString ()); } } public void println ( String s ) { if ( s != null ) { s = "服务端打印消息:" + s ; this . ui . taShow . setText ( this . ui . taShow . getText () + s + "\n" ); System . out . println ( s + "\n" ); } } public void closeServer () { try { if ( ss != null ) ss . close (); if ( reader != null ) reader . close (); if ( writer != null ) writer . close (); } catch ( IOException e ) { // TODO Auto-generated catch block e . printStackTrace (); } } } package socket . server ; import java . io . BufferedReader ; import java . io . IOException ; import java . io . InputStreamReader ; import java . io . PrintWriter ; import java . net . Socket ; /** * @author 超 * Create by fengc on 2018/7/25 21:33 * 这个类是服务器端的等待客户端发送信息* */ public class ListenerClient extends Thread { BufferedReader reader ; PrintWriter writer ; ServerUI ui ; Socket client ; public ListenerClient ( ServerUI ui , Socket client ) { this . ui = ui ; this . client = client ; this . start (); } //为每一个客户端创建线程等待接收信息,然后把信息广播出去 @Override public void run () { String msg = "" ; while ( true ) { try { reader = new BufferedReader ( new InputStreamReader ( client . getInputStream ())); writer = new PrintWriter ( client . getOutputStream (), true ); msg = reader . readLine (); sendMsg ( msg ); } catch ( IOException e ) { println ( e . toString ()); break ; } if ( msg != null && msg . trim () != "" ) { println ( "客户端 " + msg ); } } } //把信息广播到所有用户 public synchronized void sendMsg ( String msg ) { try { for ( int i = 0 ; i < ui . clients . size (); i ++) { Socket client = ui . clients . get ( i ); writer = new PrintWriter ( client . getOutputStream (), true ); writer . println ( msg ); } } catch ( Exception e ) { println ( e . toString ()); } } public void println ( String s ) { if ( s != null ) { this . ui . taShow . setText ( this . ui . taShow . getText () + s + "\n" ); System . out . println ( s + "\n" ); } } } package socket . server ; import javax . swing .*; import java . awt .*; import java . awt . event . ActionEvent ; import java . awt . event . ActionListener ; import java . awt . event . WindowAdapter ; import java . awt . event . WindowEvent ; import java . net . Socket ; import java . util . List ; /** * @author 超 * Create by fengc on 2018/7/25 21:21 */ public class ServerUI extends JFrame { public static void main ( String [] args ) { new ServerUI (); } public JButton btStart ; //启动服务器 public JButton btSend ; //发送信息按钮 public JTextField tfSend ; //需要发送的文本信息 public JTextArea taShow ; //信息展示 public Server server ; //用来监听客户端连接 static List < Socket > clients ; //保存连接到服务器的客户端 public ServerUI () { super ( "服务器端" ); btStart = new JButton ( "启动服务" ); btSend = new JButton ( "发送信息" ); tfSend = new JTextField ( 10 ); //装在输入文字 taShow = new JTextArea (); //点击按钮,所做的是事情,启动服务器 btStart . addActionListener ( new ActionListener () { public void actionPerformed ( ActionEvent e ) { server = new Server ( ServerUI . this ); } }); //点击发送消息按钮 btSend . addActionListener ( new ActionListener () { public void actionPerformed ( ActionEvent e ) { server . sendMsg ( tfSend . getText ()); tfSend . setText ( "" ); } }); //初始化界面 this . addWindowListener ( new WindowAdapter () { //关闭按钮点击事件 public void windowClosing ( WindowEvent e ) { int a = JOptionPane . showConfirmDialog ( null , "确定关闭吗?" , "温馨提示" , JOptionPane . YES_NO_OPTION ); if ( a == 1 ) { server . closeServer (); System . exit ( 0 ); // 关闭 } } }); //底部启动服务按钮与发送消息按钮 JPanel top = new JPanel ( new FlowLayout ()); top . add ( tfSend ); top . add ( btSend ); top . add ( btStart ); this . add ( top , BorderLayout . SOUTH ); //中部显示消息栏 信息展示 final JScrollPane sp = new JScrollPane (); sp . setVerticalScrollBarPolicy ( JScrollPane . VERTICAL_SCROLLBAR_ALWAYS ); sp . setViewportView ( this . taShow ); this . taShow . setEditable ( false ); this . add ( sp , BorderLayout . CENTER ); this . setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE ); this . setSize ( 400 , 300 ); this . setLocation ( 100 , 200 ); this . setVisible ( true ); } }客户端代码:
package socket . clinet ; import java . io . BufferedReader ; import java . io . IOException ; import java . io . InputStreamReader ; import java . io . PrintWriter ; import java . net . Socket ; /** * @author 超 * Create by fengc on 2018/7/25 21:41 */ public class Client extends Thread { ClientUI ui ; Socket client ; BufferedReader reader ; PrintWriter writer ; public Client ( ClientUI ui ) { this . ui = ui ; try { String ip = ui . tfIP . getText (); //得到输入的ip地址 int port = Integer . parseInt ( ui . tfPort . getText ()); //得到输入的端口 client = new Socket ( ip , port ); //这里设置连接服务器端的IP的端口 println ( "连接服务器成功,服务器端口地址:" + port ); reader = new BufferedReader ( new InputStreamReader ( client . getInputStream ())); writer = new PrintWriter ( client . getOutputStream (), true ); String name = ui . tfName . getText (); if ( name == null || "" . equals ( name )) { name = "匿名者" ; } sendMsg ( "会员 " + name + ",登录上来了........................" ); // 如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区 } catch ( NumberFormatException nu ) { println ( "端口请输入正确......." ); nu . printStackTrace (); } catch ( IOException e ) { println ( "连接服务器失败:请输入正确的IP地址与端口" ); println ( e . toString ()); e . printStackTrace (); } this . start (); } public void run () { String msg = "" ; while ( true ) { try { msg = reader . readLine (); } catch ( IOException e ) { println ( "服务器断开连接" ); break ; } if ( msg != null && msg . trim () != "" ) { println ( msg ); } } } public void sendMsg ( String msg ) { try { writer . println ( msg ); } catch ( Exception e ) { println ( e . toString ()); } } public void println ( String s ) { if ( s != null ) { this . ui . taShow . setText ( this . ui . taShow . getText () + s + "\n" ); System . out . println ( s + "\n" ); } } } package socket . clinet ; import javax . swing .*; import java . awt .*; import java . awt . event . ActionEvent ; import java . awt . event . ActionListener ; import java . awt . event . WindowAdapter ; import java . awt . event . WindowEvent ; /** * @author 超 * Create by fengc on 2018/7/25 21:40 */ public class ClientUI extends JFrame { public static void main ( String [] args ) { new ClientUI (); } public JButton btStart ; public JButton btSend ; public JTextField tfSend ; //装在输入文字 public JTextPane nameText ; //输入名字 public JTextPane ipTex ; //输入名字 public JTextPane portText ; //输入名字 public JTextField tfName ; //服务器ip public JTextField tfIP ; //服务器ip public JTextField tfPort ; //服务器端口 public JTextArea taShow ; public Client server ; public ClientUI () { super ( "客户端" ); btStart = new JButton ( "启动连接" ); btSend = new JButton ( "发送信息" ); tfSend = new JTextField ( 20 ); tfIP = new JTextField ( 8 ); tfPort = new JTextField ( 3 ); tfName = new JTextField ( 6 ); nameText = new JTextPane (); nameText . setText ( "登录名" ); nameText . setEditable ( false ); ipTex = new JTextPane (); ipTex . setText ( "服务地址" ); ipTex . setEditable ( false ); portText = new JTextPane (); portText . setText ( "服务端口" ); portText . setEditable ( false ); taShow = new JTextArea (); //启动链接按钮事件 btStart . addActionListener ( new ActionListener () { public void actionPerformed ( ActionEvent e ) { server = new Client ( ClientUI . this ); } }); //发送按钮事件 btSend . addActionListener ( new ActionListener () { public void actionPerformed ( ActionEvent e ) { String name = tfName . getText (); if ( name == null || "" . equals ( name )) { name = "匿名者" ; } server . sendMsg ( name + ":" + tfSend . getText ()); tfSend . setText ( "" ); } }); this . addWindowListener ( new WindowAdapter () { public void windowClosing ( WindowEvent e ) { int a = JOptionPane . showConfirmDialog ( null , "确定关闭吗?" , "温馨提示" , JOptionPane . YES_NO_OPTION ); if ( a == 1 ) { System . exit ( 0 ); // 关闭 } } }); //底部的发送信息框与链接按钮 JPanel top = new JPanel ( new FlowLayout ()); top . add ( tfSend ); //发送文本 top . add ( btSend ); //发送按钮 this . add ( top , BorderLayout . SOUTH ); //加载到底部 //头部放连接服务的 JPanel northJpannel = new JPanel ( new FlowLayout ()); northJpannel . add ( nameText ); northJpannel . add ( tfName ); northJpannel . add ( ipTex ); northJpannel . add ( tfIP ); northJpannel . add ( portText ); northJpannel . add ( tfPort ); northJpannel . add ( btStart ); this . add ( northJpannel , BorderLayout . NORTH ); //加载到头部 final JScrollPane sp = new JScrollPane (); sp . setVerticalScrollBarPolicy ( JScrollPane . VERTICAL_SCROLLBAR_ALWAYS ); sp . setViewportView ( this . taShow ); this . taShow . setEditable ( false ); this . add ( sp , BorderLayout . CENTER ); this . setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE ); this . setSize ( 500 , 400 ); this . setLocation ( 600 , 200 ); this . setVisible ( true ); } }以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
原文链接:https://blog.csdn.net/yundanfengqingfeng/article/details/81212632
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did221442