关于Socket的解析以及双方即时通讯的java实现方法
发布时间 - 2026-01-11 00:02:23 点击率:次在Java编程之中,我们通常都会接触到网络编程,那么不可避免地就会接触到Socket通信,下面我将对Socket进行简单的解析,并给出双方通讯的代码实现方案

首先我们来介绍一下整个Socket的通信过程
首先服务端先创建一个SocketServer,那么创建一个SocketServer需要我们指定端口号,如下
ServerSocket serverSocket=new ServerSocket(8888);
像上面这样我们就简单的开了一个端口号为8888的ServerSocket了
接下来我们需要去接收来自客户端的连接请求,也就是图中的Other Socket,我们可以利用SockerServer的accept方法来建立连接,并且这个方法会返回一个Socket,用于和Other Socker进行通信,简单来说,我们就是利用SockerServer来获取Socket,然后利用这个Socket和别人通信
接下来我们获取Socket的输入输出流,实现发送和接收信息,到此,我们已经知道两方进行Socket通信的基本思路了
接下来我们来看看关于ServerSocket以及Socket的一些关键方法
ServerSocket
首先我们看一下ServerSocket的构造方法,一共有4种:
1、无参的构造方法 :
ServerSocket(), 返回没有绑定端口号的ServerSocket实例
2、含一个参数的构造方法 :
ServerSocket(int port),返回绑定给定端口号的ServerSocket实例
3、含两个参数的构造方法 :
ServerSocket(int port, int backlog),返回绑定给定端口号的ServerSocket实例,并且设定同步队列(syns queue)的大小
4、含三个参数的构造方法:
ServerSocket(int port, int backlog, InetAddress bindAddr),返回绑定给定端口号的ServerSocket实例,并且设定同步队列(syns queue)的大小以及绑定给定的IP地址
主要看它的一些方法:
accept()
这个方法监听连接,一旦连接就返回一个Socket用于通信,需要注意的是,该方法为阻塞方法,如果没有连接程序并不会继续执行下去
close()
关闭Socket,如果accept还在阻塞的话,就会抛出一个SocketException的异常
关于ServerSocket就不多加赘述了,我们来看一看Socket
Socket
构造方法依然存在多种,这里只给出一个较为典型的
Socket(String host, int port),第一个参数是主机的IP地址作为字符串传入,第二个参数为端口号
getInputStream(), getOutputStream()
获得Socket的输入输出流,我们可以利用BufferReader以及PrintWriter来对这两个流进行操作,如下:
BufferReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(
new OutputStreamWriter(socket.getOutputStream()));
下面简单编写一个双方互相通信的java实现
首先是服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* Created by Mezereon on 2017/3/1.
*/
public class TCPServer {
private Socket socket;
private ServerSocket serverSocket;
private BufferedReader reader;
private PrintWriter writer;
private Scanner scanner = new Scanner(System.in);
//开启服务
public void run() throws IOException {
startTheSocket();
}
public void startTheSocket() throws IOException {
serverSocket=new ServerSocket(18080); //打开18080端口等待连接
acceptTheSocket();//接受连接并且初始化Socket,reader,writer
openTheNewThreadToGetMessageFromClient();
while(true) {
getYourMessage();//获取键盘数据并作为输入
}
}
//接受连接并且初始化Socket,reader,writer
private void acceptTheSocket() throws IOException {
socket=serverSocket.accept();//阻塞方法,用于接受Socket连接
System.out.println("Some one connect me ,it is "+socket.getLocalSocketAddress());//打印地址
System.out.println("It's port is "+socket.getPort());//打印端口号
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//获得输入流
writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));//获得输出流
}
//扫描键盘并输入数据
private void getYourMessage() throws IOException {
String yourMessage = scanner.nextLine();
checkYourMessage(yourMessage);//检查发送给客户端的信息
writer.println(yourMessage);//发送信息
writer.flush();//flush方法用于清空缓冲区,注意的是如果不flush你的信息可能发不出去一直存留在缓冲区
}
//用于检查是否退出
private void checkYourMessage(String yourMessage) throws IOException {
//关闭各种
if (yourMessage.equals("exit")) {
socket.close();
writer.close();
reader.close();
System.exit(0);
}
}
//开启一个新的线程来监听客户端发来的信息
private void openTheNewThreadToGetMessageFromClient() throws IOException {
//开启一个新的线程
new Thread(new Runnable() {
@Override
public void run() {
getTheMessageFromClient();
}
}).start();
}
//不断循环来获取客户端发来的信息
private void getTheMessageFromClient() {
while(true) {
String messageFromClient = null;
try {
messageFromClient = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
printTheMessage(messageFromClient);//打印客户端发来的信息
}
}
//打印客户端发来的信息
private void printTheMessage(String messageFromClient) {
if(messageFromClient!=null)
System.out.println("He say:"+messageFromClient);
}
}
然后开始编写客户端:
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
* Created by Mezereon on 2017/2/27.
*/
public class TCPClient {
private Socket socket;
private BufferedReader reader ;
private PrintWriter writer;
private Scanner scanner = new Scanner(System.in);
//开启Socket来连接
public void run() throws IOException{
startTheSocket();
}
//开始连接服务端
private void startTheSocket() throws IOException{
toConnectTheServer();//创建Socket并初始化
openTheThreadToReceiveInfoFromServer();//开启一个新的线程来接受服务端发来的信息
//一个循环,用于读取键盘的输入
while(true) {
String yourMessage = scanner.nextLine();
//不为空则发送信息
if(yourMessage!=null) {
writer.println(yourMessage);
writer.flush();//记得flush清空缓冲区
}
//判断是否退出
if (yourMessage.equals("exit")) {
disConnect();
System.exit(0);
}
}
}
//创建一个Socket来连接本机的18080端口的服务端并初始化reader和writer
private void toConnectTheServer() throws IOException {
socket=new Socket("127.0.0.1",18080);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
}
private void openTheThreadToReceiveInfoFromServer() throws IOException {
new Thread(new Runnable() {
@Override
public void run() {
try {
printMessage();//打印从服务端收到的信息
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
//循环不断读取服务端的信息
private void printMessage() throws IOException {
while (true) {
String messageFromServer = null;
try {
messageFromServer = reader.readLine();//读取信息
System.out.println("He say:" + messageFromServer);//打印信息
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e) {
}
if(messageFromServer.equals("exit")){
disConnect();//关闭连接
System.exit(0);
}
}
}
//关闭各种
private void disConnect() throws IOException {
socket.close();
reader.close();
writer.close();
}
}
至此,关于Socket通信简单的介绍以及利用java进行简单的通信的实现就结束了~
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# java
# socket
# 通讯
# socket即时通讯
# 双方通讯
# Java的Socket通讯基础编程完全指南
# Android 模拟器(JAVA)与C++ socket 通讯 分享
# 基于Java语言实现Socket通信的实例
# java使用MulticastSocket实现组播
# java使用MulticastSocket实现基于广播的多人聊天室
# java+jdbc+mysql+socket搭建局域网聊天室
# java 实现websocket的两种方式实例详解
# java socket实现聊天室 java实现多人聊天功能
# Java socket通讯实现过程及问题解决
# 端口号
# 服务端
# 客户端
# 绑定
# 的是
# 就会
# 创建一个
# 可以利用
# 接触到
# 清空
# 流进
# 还在
# 第一个
# 就不
# 开了
# 这两个
# 第二个
# 如果没有
# 来看看
# 将对
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在万网开始建站?分步指南解析
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
使用spring连接及操作mongodb3.0实例
javascript基于原型链的继承及call和apply函数用法分析
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
如何用虚拟主机快速搭建网站?详细步骤解析
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
Laravel如何处理CORS跨域请求?(配置示例)
javascript中闭包概念与用法深入理解
如何在IIS中配置站点IP、端口及主机头?
黑客如何利用漏洞与弱口令入侵网站服务器?
轻松掌握MySQL函数中的last_insert_id()
装修招标网站设计制作流程,装修招标流程?
jQuery中的100个技巧汇总
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
南京网站制作费用,南京远驱官方网站?
如何在建站主机中优化服务器配置?
微信小程序 scroll-view组件实现列表页实例代码
Laravel定时任务怎么设置_Laravel Crontab调度器配置
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
如何用VPS主机快速搭建个人网站?
如何快速选择适合个人网站的云服务器配置?
Laravel API资源类怎么用_Laravel API Resource数据转换
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Python数据仓库与ETL构建实战_Airflow调度流程详解
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
js实现点击每个li节点,都弹出其文本值及修改
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
大型企业网站制作流程,做网站需要注册公司吗?
JavaScript如何实现继承_有哪些常用方法
零服务器AI建站解决方案:快速部署与云端平台低成本实践
如何批量查询域名的建站时间记录?
Laravel如何配置Horizon来管理队列?(安装和使用)
如何生成腾讯云建站专用兑换码?
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
如何快速生成凡客建站的专业级图册?
如何彻底删除建站之星生成的Banner?
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
HTML 中动态设置元素 name 属性的正确语法详解
Laravel中的withCount方法怎么高效统计关联模型数量
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
详解阿里云nginx服务器多站点的配置
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
用yum安装MySQLdb模块的步骤方法
Laravel中的Facade(门面)到底是什么原理
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
如何用好域名打造高点击率的自主建站?
下一篇:yii框架实现邮件发送
下一篇:yii框架实现邮件发送

