Socket 基础解析使用ServerSocket建立聊天服务器
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建立聊天服务器相关推荐
- java搭建聊天服务器_使用 ServerSocket 建立聊天服务器-2
1. 从serverListener中可以看出,每一个客户端创建新的请求之后,都会把它分配给一个独立的chatsocket ,但是每一个ChatSocket都是相互独立的,他们之间并不能沟通,所以要新 ...
- 【网络聊天室】——基于socket编程的TCP/UDP网络聊天服务器
早期网络刚刚普及的时候,给人们印象最深的就是上网聊天,虽然作为一名上世纪的尾巴刚刚出生的我没有经历过,但仍从有所耳闻,那个时期是网络聊天室风靡的年代,全国知名聊天室大家都争破头的想要进去,基于如上和一 ...
- socket.io搭建分布式Web推送服务器
socket.io是目前较为流行的web实时推送框架,其基于nodejs语言开发,底层用engine.io实现. 借助nodejs语言异步的特性,其获得了不错的性能.但单个实例的socket.io依然 ...
- (转)API SOCKET基础(一) TCP建立连接并通信
写这篇日志,并不是要记录令人眼前一亮的算法,只是为了本人健忘的脑袋做一点准备. 要进行网络通信编程,就要用到socket(套接字),下面以TCP为例展示如何利用socket通信. 要 进行socket ...
- 基于Python Tkiner、thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信
基于Python Tkiner.thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信 完整代码下载地址:基于Python Tkiner.thread与soc ...
- socket基础知识以及各种使用场景
一.socket的基础知识 1.1socket的使用场景以及分类 socket本来也是用于本地进程间通信的,后来有了TCP/IP协议族的加入,才能实现跨主机通信. socket是一个函数,我们可以指定 ...
- [NUAA]Python用UDP协议建立带有私聊功能的网络聊天室-建立聊天工具
文章目录 前言 1.网络聊天室的基本架构是什么? 1.1 客户端和服务器的架构 1.2 通信协议的选择以及多线程通信 1.2.1 多线程通信 1.2.2 通信协议选择 1.3 前后端功能设计思路 1. ...
- socket通信实例(简单的聊天室)
这次程序运用socket通信实现一个简单的聊天室. 一开始是想在控制台实现,但遇到问题是输出和输入都在一个界面上,最后还是编一个swing程序来实现. 服务器对每一个客户端分配一个线程,run函数实现 ...
- 最全面的Socket使用解析
前言 Socket的使用在Android的网络编程中非常重要 今天我将带大家全面了解Socket及其使用方法 目录 1.网络基础 1.1 计算机网络分层 计算机网络分为五层:物理层.数据链路层.网络 ...
最新文章
- 手动特征工程已经OUT了!自动特征工程才是改进机器学习的方式
- R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(改变图例位置)实战(dot plot)
- java五子棋代码详解_java打卡9.5 用方法封装循环点菜代码 详解
- JQuery Mobile 手机显示页面偏小
- MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】
- 先进制造技术论文_干货分享:新能源汽车先进制造技术
- 有n 个长为m+1 的字符串,求前后m个字符匹配所能形成的最长字符串链:利用弗洛伊德算法求最长路径...
- Android NDK开发: 通过C/C++调用第三方so库
- [转]触碰心灵34句
- JavaScript中document.getElementById和document.write
- C语言自学笔记(16)
- 关于我很想吐槽公司的策划同学这件事
- cadence使用教程
- tableau表计算--柏拉图曲线
- 帮忙写一份2022年医院信息科年度工作汇报
- vue-easytable 单元格样式设置
- 那年的夏天很笛子 : )
- 这份简历竟然值50w年薪?
- Windows作为NTP同步时间的服务器时的设置
- 三、全国计算机二级Python考试——基本操作题(二)