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();}@Overridepublic 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 blocke.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();}//为每一个客户端创建线程等待接收信息,然后把信息广播出去@Overridepublic 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; //服务器ippublic     JTextField tfIP; //服务器ippublic     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);}}

简单局域网聊天室--Java版相关推荐

  1. 局域网服务器发送消息,Java实现简单局域网聊天室

    本文实例为大家分享了Java实现简单局域网聊天室的具体代码,供大家参考,具体内容如下 Java 的Socket编程: 1.TCP协议是面向连接的.可靠的.有序的.以字节流的方式发送数据,通过三次握手方 ...

  2. 简单聊天室(java版)

    这是本人从其他地方学习到的关于聊天室的一个模本,我从中截取了一部分关于客户端和服务端通信的Socket的内容.希望对大家对socket有个了解,我写的这些代码可以实现两人或多人在多台电脑上实现简单的对 ...

  3. java毕业设计——基于java+TCP+UDP的局域网聊天室系统设计与实现(毕业论文+程序源码)——局域网聊天室系统

    基于java+TCP+UDP的局域网聊天室系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+TCP+UDP的局域网聊天室系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...

  4. java网络编程,通过TCP,Socket实现多对一的局域网聊天室

    java网络编程,通过TCP,Socket实现多对一的局域网聊天室 可以实现多个客户端连接服务器,服务器接收到信息就会把信息广播到所有的客户端 这是服务器端的代码 View Code import j ...

  5. java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些java方面的技术应用. 今天没什么事做,基于udp协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对java网络编程方面的一个简单回忆. ...

  6. java 简单的聊天室_Java简单聊天室

    实现Java简单的聊天室 所用主要知识:多线程+网络编程 效果如下图 /** * * @author Administrator * *简单的多人聊天系统--重点:同时性,异步性 *1.客户端:发送消 ...

  7. Java实现多线程局域网聊天室

    Java多线程局域网聊天室 局域网聊天室 1.TCP 2.套接字 3.C/S架构 4.多线程 5.服务器 客户端 局域网聊天室 在学习了一个学期的java以后,觉得java真是博大精深,彻底放弃了因为 ...

  8. java udp 聊天室_Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. ...

  9. 视频教程-网络聊天室Java基础版(Socket_Swing编程)仿QQ聊天-Java

    网络聊天室Java基础版(Socket_Swing编程)仿QQ聊天 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富 ...

最新文章

  1. java 中jtextfield访问限制_java.swing JtextField 中怎么限制只能输入数字
  2. 给年轻人的30条忠告【转自[蓉儿]的QQ空间】
  3. [原创]java获取word里面的文本
  4. mysql服务器默认操作字符集,如何在mysql中找到默认服务器字符集?
  5. python从txt读取数据并画图_Python读取txt某几列绘图的方法
  6. Android-消息机制总结
  7. 碱度控制化学品行业调研报告 - 市场现状分析与发展前景预测
  8. NAT穿透-P2P-UDP打洞
  9. 天猫魔盒android开发者模式,【当贝市场】天猫魔盒M16S开启远程调试模式教程
  10. 【探究服务】——服务的更多技巧
  11. 微信小程序: 赞赏码的长按识别
  12. UEditor(集成 135 编辑器插件)(附源码)
  13. 最新苹果手机iPhone各机型尺寸以及像素对照表
  14. GEE:LST地表温度反演函数(针对Landsat8的T1影像和T1_L2影像集合)
  15. WIN10 设置自动定时开机
  16. Google新闻vs门户新闻:决裂还是共存
  17. ffmpegguitool下载不了_FFmpeg GUI Tool下载-FFmpeg GUI Tool(视频处理)下载v1.2.4 安卓版-西西软件下载...
  18. input 只能输入正整数,包括 0
  19. Medium题目总结
  20. [JS]JS模拟Alert弹出框效果--自定义CSS样式

热门文章

  1. java 兑换码生成_java生成兑换码礼包码--工具类
  2. mysql创建新用户
  3. ARM Mali-V VPU视频处理单元介绍 V61 V550 V500
  4. win7 计算机游戏不见了怎么办,Win10系统中的小游戏不见了怎么找回
  5. matlab烟花动图程序,用PS制作漂亮烟花绽放效果的GIF图片
  6. css图片颜色设置为黑白
  7. 怎么打包python环境_python环境搭建和打包
  8. 咱就是说,方言配音的软件能有多少
  9. git Bash 命令行大全
  10. 使用极光推送发送短信验证码