1.socket 简介

Socket 又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。ServerSocket 用于服务器端,Socket 是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个 Socket 实例,操作这个实例,完成所需的会话。

2.ServerSocket 的建立与使用

最简单的建立服务器ServerSocket

public class MyServerSocket {public static void main(String[] args) {try {//1-65535 监听12345端口ServerSocket serverSocket = new ServerSocket(12345);//监听客户端链接,调用accept()方法 accept方法是一个阻塞的方法,会阻塞当前线程Socket socket = serverSocket.accept();//客户端有请求时,弹出提示框JOptionPane.showMessageDialog(null, "有客户链接到了本机的12345端口");} catch (IOException e) {e.printStackTrace();}}
}

运行该代码,会发现程序阻塞在serverSocket.accept()处,打开浏览器请求127.0.0.1:12345  会有弹窗,程序结束

3.使用 ServerSocket 建立聊天服务器-1

上述方法是不合理的,因为accept()方法会造成程序阻塞,这样,主线程就会被阻塞,对于阻塞的代码,需要放置到独立线程中,修改如下

public class MyServerSocket {public static void main(String[] args) {new ServerListener().start();}
}

监听链接的线程

/*** 监听连接的线程*/
public class ServerListener extends Thread{@Overridepublic void run() {try {//1-65535 监听12345端口ServerSocket serverSocket = new ServerSocket(12345);//监听客户端链接,调用accept()方法 accept方法是一个阻塞的方法,会阻塞当前线程//每当有一个客户端连接到当前的serversocket就会返回一个新的socket对象,所以当有多个的时候//就要创建一个while循环来监听来自客户端的链接while (true) {//true,让他一直处于循环,不会结束Socket socket = serverSocket.accept();//客户端有请求时,弹出提示框JOptionPane.showMessageDialog(null, "有客户链接到了本机的12345端口");//由于每个socket又要与独立的客户端进行通讯,所以将socket传递给新的线程new ChatSocket(socket).start();}} catch (IOException e) {e.printStackTrace();}}}

用于通讯的线程

/*** 创建用于socket通信的线程*/
public class ChatSocket extends Thread {Socket socket;//本地需要有socket来接受传入的s值public ChatSocket(Socket s){this.socket=s;}public void out(String out){try {// 执行数据的输出和相关功能的包装socket.getOutputStream().write(out.getBytes("UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void run() {int count = 0;while (true) {count++;out("loop:"+count);try {sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

此时一个线程版的socket通信就算结束了,打开cmd 输入telnet localhost 12345会有惊喜哦

这种惊喜('telnet' 不是内部或外部命令,也不是可运行的程序)的自行百度

此时可以同时打开多个cmd 效果相同

4.使用 ServerSocket 建立聊天服务器-2

以上是一个简单的socket聊天服务器,但是当前的服务器只有向客户端发送数据的功能,并没有从客户端读取数据的功能!

每个ChatSocket线程都是独立的,不能相互共同数据,建立ChatManager沟通所有数据,代码修改如下:

public class MyServerSocket {public static void main(String[] args) {new ServerListener().start();}
}

监听链接的线程

/*** 监听连接的线程*/
public class ServerListener extends Thread{@Overridepublic void run() {try {//1-65535 监听12345端口ServerSocket serverSocket = new ServerSocket(12345);//监听客户端链接,调用accept()方法 accept方法是一个阻塞的方法,会阻塞当前线程//每当有一个客户端连接到当前的serversocket就会返回一个新的socket对象,所以当有多个的时候//就要创建一个while循环来监听来自客户端的链接while (true) {//true,让他一直处于循环,不会结束Socket socket = serverSocket.accept();//客户端有请求时,弹出提示框JOptionPane.showMessageDialog(null, "有客户链接到了本机的12345端口");//由于每个socket又要与独立的客户端进行通讯,所以将socket传递给新的线程ChatSocket cs = new ChatSocket(socket);cs.start();ChatManager.getChatManager().add(cs);}} catch (IOException e) {e.printStackTrace();}}}

创建用于socket通信的线程

/*** 创建用于socket通信的线程*/
public class ChatSocket extends Thread {Socket socket;//本地需要有socket来接受传入的s值public ChatSocket(Socket s){this.socket=s;}public void out(String out){try {// 执行数据的输出和相关功能的包装socket.getOutputStream().write(out.getBytes("UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void run() {//run方法中加入接收数据的功能try {BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));String line = null;while ((line = br.readLine())!=null) {//客户端的数据//发给聊天室的所有人ChatManager.getChatManager().publish(this, line);}br.close();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

聊天管理类

/*** 聊天管理类*/
public class ChatManager {//单例化该ChatManagerprivate ChatManager(){}private static final ChatManager cm = new ChatManager();public static ChatManager getChatManager(){return cm;}Vector<ChatSocket> vector = new Vector<ChatSocket>();public void add(ChatSocket cs){vector.add(cs);}public void publish(ChatSocket cs,String out){for(int i=0;i<vector.size();i++){ChatSocket cschatSocket = vector.get(i);if(!cs.equals(cschatSocket)){//发送消息的对象不接受消息本身
                cschatSocket.out(out);}}}
}

打开多个cmd,实现聊天功能,无论在哪个终端发,都能接收到消息

Socket 基础解析使用ServerSocket建立聊天服务器相关推荐

  1. java搭建聊天服务器_使用 ServerSocket 建立聊天服务器-2

    1. 从serverListener中可以看出,每一个客户端创建新的请求之后,都会把它分配给一个独立的chatsocket ,但是每一个ChatSocket都是相互独立的,他们之间并不能沟通,所以要新 ...

  2. 【网络聊天室】——基于socket编程的TCP/UDP网络聊天服务器

    早期网络刚刚普及的时候,给人们印象最深的就是上网聊天,虽然作为一名上世纪的尾巴刚刚出生的我没有经历过,但仍从有所耳闻,那个时期是网络聊天室风靡的年代,全国知名聊天室大家都争破头的想要进去,基于如上和一 ...

  3. socket.io搭建分布式Web推送服务器

    socket.io是目前较为流行的web实时推送框架,其基于nodejs语言开发,底层用engine.io实现. 借助nodejs语言异步的特性,其获得了不错的性能.但单个实例的socket.io依然 ...

  4. (转)API SOCKET基础(一) TCP建立连接并通信

    写这篇日志,并不是要记录令人眼前一亮的算法,只是为了本人健忘的脑袋做一点准备. 要进行网络通信编程,就要用到socket(套接字),下面以TCP为例展示如何利用socket通信. 要 进行socket ...

  5. 基于Python Tkiner、thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信

    基于Python Tkiner.thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信 完整代码下载地址:基于Python Tkiner.thread与soc ...

  6. socket基础知识以及各种使用场景

    一.socket的基础知识 1.1socket的使用场景以及分类 socket本来也是用于本地进程间通信的,后来有了TCP/IP协议族的加入,才能实现跨主机通信. socket是一个函数,我们可以指定 ...

  7. [NUAA]Python用UDP协议建立带有私聊功能的网络聊天室-建立聊天工具

    文章目录 前言 1.网络聊天室的基本架构是什么? 1.1 客户端和服务器的架构 1.2 通信协议的选择以及多线程通信 1.2.1 多线程通信 1.2.2 通信协议选择 1.3 前后端功能设计思路 1. ...

  8. socket通信实例(简单的聊天室)

    这次程序运用socket通信实现一个简单的聊天室. 一开始是想在控制台实现,但遇到问题是输出和输入都在一个界面上,最后还是编一个swing程序来实现. 服务器对每一个客户端分配一个线程,run函数实现 ...

  9. 最全面的Socket使用解析

    前言 Socket的使用在Android的网络编程中非常重要 今天我将带大家全面了解Socket及其使用方法  目录 1.网络基础 1.1 计算机网络分层 计算机网络分为五层:物理层.数据链路层.网络 ...

最新文章

  1. 手动特征工程已经OUT了!自动特征工程才是改进机器学习的方式
  2. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(改变图例位置)实战(dot plot)
  3. java五子棋代码详解_java打卡9.5 用方法封装循环点菜代码 详解
  4. JQuery Mobile 手机显示页面偏小
  5. MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】
  6. 先进制造技术论文_干货分享:新能源汽车先进制造技术
  7. 有n 个长为m+1 的字符串,求前后m个字符匹配所能形成的最长字符串链:利用弗洛伊德算法求最长路径...
  8. Android NDK开发: 通过C/C++调用第三方so库
  9. [转]触碰心灵34句
  10. JavaScript中document.getElementById和document.write
  11. C语言自学笔记(16)
  12. 关于我很想吐槽公司的策划同学这件事
  13. cadence使用教程
  14. tableau表计算--柏拉图曲线
  15. 帮忙写一份2022年医院信息科年度工作汇报
  16. vue-easytable 单元格样式设置
  17. 那年的夏天很笛子 : )
  18. 这份简历竟然值50w年薪?
  19. Windows作为NTP同步时间的服务器时的设置
  20. 三、全国计算机二级Python考试——基本操作题(二)

热门文章

  1. OPENCV图像创建,保存和复制
  2. 【模板】RMQ问题—st表实现
  3. MongoDB 4.0 事务实现解析
  4. 三星自动驾驶汽车路测获批,进军无人驾驶领域
  5. 何新生—你是哪国人?
  6. python-34:极视界爬虫总结
  7. windows7+Apache2.2+PHP5.4.29 环境搭建
  8. 8天学通MongoDB——第三天 细说高级操作
  9. 让产品自己召唤人——马化腾
  10. [转] 一个OpenSource的评价图