基于Tcp协议的简单Socket通信实例(JAVA)

java socket发送定长报文_一个基于TCP协议的Socket通信实例 原标题:一个基于TCP协议的Socket通信实例 1. 前言一般接口对接多以http/https或webservice的方式,socket方式的对接比较少并且会有一些难度。正好前段时间完成了一个socket的接口的对接需求,现将实现的思路做一个整理。2. 需求概述2.1 需要提供一个socket服务端,实时接收三方传递过来的数据2.2 实时报文规范说明2.2.1 通讯及接口格式说明通讯方式:通讯采... 阅读详情

原文:http://www.cnblogs.com/lichenwei/p/4069432.html


1、首先先来看下基于TCP协议Socket服务端和客户端的通信模型:

 

Socket通信步骤:(简单分为4步)

1.建立服务端ServerSocket和客户端Socket

2.打开连接到Socket的输出输入流

3.按照协议进行读写操作

4.关闭相对应的资源

 

2、相关联的API:

 

1.首先先来看下ServerSocket

类 ServerSocket 

此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。 

一些重要的方法:(具体大家查看官方api吧)

ServerSocket(int port, int backlog) 
利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。

bind(SocketAddress endpoint, int backlog) 
将 ServerSocket 绑定到特定地址(IP 地址和端口号)。

accept() 
侦听并接受到此套接字的连接

getInetAddress() 
返回此服务器套接字的本地地址。

 close() 
关闭此套接字。

 

2.再来看下Socket

类 Socket  

此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。

一些重要的方法:(具体大家查看官方api吧)

Socket(InetAddress address, int port) 
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

getInetAddress() 
返回套接字连接的地址。

shutdownInput() 
此套接字的输入流置于“流的末尾”。

shutdownOutput() 
禁用此套接字的输出流。

close() 
关闭此套接字。

 

3、代码实现:(注释很全,这里就不详细多说了)

服务端Server.java

1.创建ServerSocket对象,绑定并监听端口

2.通过accept监听客户端的请求

3.建立连接后,通过输出输入流进行读写操作

4.关闭相关资源

复制代码
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.io.PrintWriter;
 7 import java.net.ServerSocket;
 8 import java.net.Socket;
 9 
10 
11 public class Server {
12 
13     /**
14      * Socket服务端
15      */
16     public static void main(String[] args) {
17         try {
18             ServerSocket serverSocket=new ServerSocket(8888);
19             System.out.println("服务端已启动,等待客户端连接..");
20             Socket socket=serverSocket.accept();//侦听并接受到此套接字的连接,返回一个Socket对象
21             
22             
23             //根据输入输出流和客户端连接
24             InputStream inputStream=socket.getInputStream();//得到一个输入流,接收客户端传递的信息
25             InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//提高效率,将自己字节流转为字符流
26             BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//加入缓冲区
27             String temp=null;
28             String info="";
29             while((temp=bufferedReader.readLine())!=null){
30                 info+=temp;
31                 System.out.println("已接收到客户端连接");
32                 System.out.println("服务端接收到客户端信息:"+info+",当前客户端ip为:"+socket.getInetAddress().getHostAddress());
33             }
34             
35             OutputStream outputStream=socket.getOutputStream();//获取一个输出流,向服务端发送信息
36             PrintWriter printWriter=new PrintWriter(outputStream);//将输出流包装成打印流
37             printWriter.print("你好,服务端已接收到您的信息");
38             printWriter.flush();
39             socket.shutdownOutput();//关闭输出流
40             
41             
42             
43             //关闭相对应的资源
44             printWriter.close();
45             outputStream.close();
46             bufferedReader.close();
47             inputStream.close();
48             socket.close();
49             
50         } catch (IOException e) {
51             e.printStackTrace();
52         }
53     }
54 
55 }
复制代码

 

客户端Client.java

1.创建Socket对象,指定服务端的地址和端口号

2.建立连接后,通过输出输入流进行读写操作

3.通过输出输入流获取服务器返回信息

4.关闭相关资源

复制代码
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.io.PrintWriter;
 7 import java.net.Socket;
 8 import java.net.UnknownHostException;
 9 
10 
11 public class Client {
12 
13     /**
14      * Socket客户端
15      */
16     public static void main(String[] args) {
17         try {
18             //创建Socket对象
19             Socket socket=new Socket("localhost",8888);
20             
21             //根据输入输出流和服务端连接
22             OutputStream outputStream=socket.getOutputStream();//获取一个输出流,向服务端发送信息
23             PrintWriter printWriter=new PrintWriter(outputStream);//将输出流包装成打印流
24             printWriter.print("服务端你好,我是Balla_兔子");
25             printWriter.flush();
26             socket.shutdownOutput();//关闭输出流
27             
28             InputStream inputStream=socket.getInputStream();//获取一个输入流,接收服务端的信息
29             InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//包装成字符流,提高效率
30             BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//缓冲区
31             String info="";
32             String temp=null;//临时变量
33             while((temp=bufferedReader.readLine())!=null){
34                 info+=temp;
35                 System.out.println("客户端接收服务端发送信息:"+info);
36             }
37             
38             //关闭相对应的资源
39             bufferedReader.close();
40             inputStream.close();
41             printWriter.close();
42             outputStream.close();
43             socket.close();
44         } catch (UnknownHostException e) {
45             e.printStackTrace();
46         } catch (IOException e) {
47             e.printStackTrace();
48         }
49 
50     }
51 
52 }
复制代码

 

4、效果截图:

服务端:

客户端:

 

 

以上代码实现了单客户端和服务端的连接,若要实现多客户端操作,需要涉及到多线程,只要你把每个接收到的Socket对象单独开一条线程操作,然后用一个死循环while(true)去监听端口就行,这边直接给代码了

 

线程操作类:SocketThread.java

复制代码
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.io.PrintWriter;
 7 import java.net.Socket;
 8 
 9 /**
10  * Socket多线程处理类 用来处理服务端接收到的客户端请求(处理Socket对象)
11  */
12 public class SocketThread extends Thread {
13     private Socket socket;
14 
15     public SocketThread(Socket socket) {
16         this.socket = socket;
17     }
18 
19     public void run() {
20         // 根据输入输出流和客户端连接
21         try {
22             InputStream inputStream = socket.getInputStream();
23             // 得到一个输入流,接收客户端传递的信息
24             InputStreamReader inputStreamReader = new InputStreamReader(
25                     inputStream);// 提高效率,将自己字节流转为字符流
26             BufferedReader bufferedReader = new BufferedReader(
27                     inputStreamReader);// 加入缓冲区
28             String temp = null;
29             String info = "";
30             while ((temp = bufferedReader.readLine()) != null) {
31                 info += temp;
32                 System.out.println("已接收到客户端连接");
33                 System.out.println("服务端接收到客户端信息:" + info + ",当前客户端ip为:"
34                         + socket.getInetAddress().getHostAddress());
35             }
36 
37             OutputStream outputStream = socket.getOutputStream();// 获取一个输出流,向服务端发送信息
38             PrintWriter printWriter = new PrintWriter(outputStream);// 将输出流包装成打印流
39             printWriter.print("你好,服务端已接收到您的信息");
40             printWriter.flush();
41             socket.shutdownOutput();// 关闭输出流
42 
43             // 关闭相对应的资源
44             bufferedReader.close();
45             inputStream.close();
46             printWriter.close();
47             outputStream.close();
48         } catch (IOException e) {
49             e.printStackTrace();
50         }
51 
52     }
53 
54 }
复制代码

 

服务端类:Server.java

复制代码
 1 import java.io.IOException;
 2 import java.net.ServerSocket;
 3 import java.net.Socket;
 4 
 5 public class Server {
 6 
 7     /**
 8      * Socket服务端
 9      */
10     public static void main(String[] args) {
11         try {
12             ServerSocket serverSocket = new ServerSocket(8888);
13             System.out.println("服务端已启动,等待客户端连接..");
14 
15             while (true) {
16                 Socket socket = serverSocket.accept();// 侦听并接受到此套接字的连接,返回一个Socket对象
17                 SocketThread socketThread = new SocketThread(socket);
18                 socketThread.start();
19             }
20 
21         } catch (IOException e) {
22             e.printStackTrace();
23         }
24     }
25 
26 }
复制代码

 

客户端类:Client.java

复制代码
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.io.PrintWriter;
 7 import java.net.Socket;
 8 import java.net.UnknownHostException;
 9 
10 
11 public class Client {
12 
13     /**
14      * Socket客户端
15      */
16     public static void main(String[] args) {
17         try {
18             //创建Socket对象
19             Socket socket=new Socket("localhost",8888);
20             
21             //根据输入输出流和服务端连接
22             OutputStream outputStream=socket.getOutputStream();//获取一个输出流,向服务端发送信息
23             PrintWriter printWriter=new PrintWriter(outputStream);//将输出流包装成打印流
24             printWriter.print("服务端你好,我是客户1");
25             printWriter.flush();
26             socket.shutdownOutput();//关闭输出流
27             
28             InputStream inputStream=socket.getInputStream();//获取一个输入流,接收服务端的信息
29             InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//包装成字符流,提高效率
30             BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//缓冲区
31             String info="";
32             String temp=null;//临时变量
33             while((temp=bufferedReader.readLine())!=null){
34                 info+=temp;
35                 System.out.println("客户端接收服务端发送信息:"+info);
36             }
37             
38             //关闭相对应的资源
39             bufferedReader.close();
40             inputStream.close();
41             printWriter.close();
42             outputStream.close();
43             socket.close();
44         } catch (UnknownHostException e) {
45             e.printStackTrace();
46         } catch (IOException e) {
47             e.printStackTrace();
48         }
49 
50     }
51 
52 }
复制代码

 

看下效果实现图:

 

这里只是抛砖引玉,在实际开发中,基于Socket编程,一般传递的并非字符串,很多情况下是对象,我们可以使用ObjectOutputStream将输出流对象序列化。

例如:

1             OutputStream outputStream = socket.getOutputStream();
2             ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
3             User user=new User("admin","123456");
4             objectOutputStream.writeObject(user);

 


JAVA Socket通信中自定义TCP通信协议 JAVA中Socket通信是以流的形式传输数据,对于InputStream和OutputStream的装饰问题,如果只是传输一串字符串,可以通过简单的BufferedReader和PrintWriter实现,但是在实际的客户端与服务端通信中不可能只是传递简单字符串,会有各种不同形式的信息,若是传输对象,则可以用 ObjectInputStream和ObjectOutputStream来实现,但是这 阅读详情

相关推荐

Java实现基于TCP协议的Socket通信实战详解

为实现真正的跨平台互操作性,建议设计轻量级应用层协议,在每条消息前加入元信息头。常见结构如下:| 消息总长度(4B) | 编码类型(1B) | 实际内容(N bytes) |

weixin_33068055的博客 1053

Socket介绍及使用Java实现socket通信

使用Java实现socket通信。

weixin_49561506的博客 2万+

SocketConnector连接器

SocketConnector连接器

java学习——mina篇

mina是对nio的具体实现。是目前比较高效和流行的nio框架了。 下面是对使用mina进行通讯的一个简单demo,后面再用mina写一个RPC的简单框架。 mina主要包括: (使用的mina版本为2.0.0.M4 core,具体可见官方网站 ) mina也分服务端和客户端(这是肯定的...) 其中服务端为:NioSocketAcceptor 客户端为:NioSocketC...

yznkaixin的专栏 257

测试用例经典练习之微信发红包测试用例

微信发红包测试用例

ZCYaiCLX3344的博客 1万+

别再只调API了!深度拆解Dify文件上传的两种传参方式(sys.file vs. inputs.upload_file)

本文深度解析Dify平台文件上传的两种传参方式——sys.file与inputs.upload_file,详细对比其设计原理、技术实现及适用场景。通过代码示例和性能分析,帮助开发者在本地大模型应用中做出精准技术选型,提升文件处理效率与系统稳定性。

weixin_29063979的博客 268

Java 基于TCP的Socket网络编程的入门及示例

前言:各位周末愉快,因匿名台风来袭,窗外又是一波风雨交加,所以又是哪都不想去……话说给我天晴还不是一样窝在家里。。。好了,这篇是总结了tcp的socket,各种例子,应该是比较全了,记在这里,用到时可以过来瞄一眼。 原文出处: Socket网络这块很重要的是指定ip地址,端口号等基本信息。这些信息被封装在InetAddress中,所以先上一个小Demo介绍InetAddress的几个基本方法。

让技术为我所用 2157

Python 爬取新浪财经 7x24(1): 下载数据

前言 最近在做一个需要很多财经数据的项目。于是想到可不可以通过爬虫来解决(尝试白嫖)。 提供财经数据的网站有很多个,其中比较靠谱和更新比较及时的应该是新浪7x24 live数据。 http://finance.sina.com.cn/7x24/?tag=0 这个问题有一定的难度,因为这个网页是动态加载的。每一次只会加载部分数据,而只有拉到底部才可以加载新的数据。 于是乎,我们要做的事情是: 下载数据 保存到数据库 本篇介绍如何下载数据。 代码 闲言少叙书归正文,代码的实现如下: import reque

ZJ_11701的博客 2905

java socket通讯实例_Java基于TCP的socket通讯案例

java中的socket编程案例,一个是服务端,一个是客户端,运行时先启动服务端,再启动客户端。//客户端packagecom.socket;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava...

weixin_35935249的博客 227

在Rviz仿真环境中搭建传送带

<geometry><material>

qq_58268456的博客 936

关于Arduino中的常用函数

一、I/O函数 二、时间函数 三、数学函数 abs 返回其参数的无符号值 【abs(12)返回12,abs(-12)也返回12】 constrain 限制一个数字以阻止它超出范围。第一个参数是被限制的数字,第二个参数是范围区间的开始,第三个参数是允许的数字范围区间的结尾。 【constrain(8,1,10)返回8,constrain(11,1,10)返回10,constrain(0,1,10)返回1】 map 将一个范围内的数字映射到另一个范围。第一个参数是要映射到数字,第二个和第三个参数是from范围(

TREE的博客 7323

Java Socket通信之TCP协议

java流套接字通信模型 TCP流套接字编程 两个例子(回显服务器/查字典服务器) TCP中的长短连接 短连接 长连接 协议 为什么需要协议? 封装/分用 VS 序列化/反序列化 自定义协议

可能是一只知更鸟 4587

宇树G1双足机器人SLAM开发环境搭建实战指南

SLAM(同步定位与建图)是机器人自主导航的核心技术。在双足人形机器人平台上,由于运动模型复杂、机身晃动带来高频IMU噪声,SLAM开发对环境配置和依赖管理提出了更高要求。以宇树G1为例,系统阐述如何通过Ubuntu 20.04、ROS Noetic与Docker容器化方案构建可复现的SLAM开发环境。先介绍依赖分层管理与版本锁定原理,再深入catkin工作空间编译、传感器驱动集成、网络与多机通信配置等工程实践,最后提供常见问题排查与避坑指南。这套方法论不仅适用于G1,也可迁移至其他双足或轮式机器人平台,帮

weixin_32025789的博客 267

Java实现基于TCP协议的Socket通信:构建高效网络通信的基石

Java实现基于TCP协议的Socket通信:构建高效网络通信的基石 去发现同类优质开源项目:https://gitcode.com/ 在网络通信领域,Socket 编程一直是基础且关键的技术。今天,我们要介绍的是一个基于TCP协议的Java Socket通信项目,该项目不仅能帮助开发者轻松实现服务器与客户端的通信,还能实现客户端之间的直接交互。 项目介绍 Java实现基于TCP协议的Socket...

gitblog_06742的博客 740

物联网通信中NB-IoT、Cat.1、LTE-M该如何选择?

首先我们要确定我们产品的关键需求,例如:我们的设备是否对数据传输速率有较高的要求,有较高要求我们就需要选择较高传输速率的Cat.1来开发我们的产品。同时关于产品性能方面,我们对功耗、延迟、可靠性也会有所要求,例如我们的产品为移动端产品,不方便布线以及安装电源,那我们就会采用电池供电的方式,所以在选择时可以优先考虑低功耗产品,最终结合其他需求选择出合适的协议。首先,我们需求的产品是不同的,我们需要根据产品需求或项目需求来进行选择,NB-IoT、Cat.1、Cat.M都有属于自己的优势。

a1809032425的博客 1216

数据结构(超详细讲解!!)第十七节 队列应用(杨辉三角)

杨辉三角

2201_76115387的博客 1375

Java 基于TCP协议的Socket编程和通信 案例2

Java 基于TCP协议的Socket编程和通信 参考学习网址: https://blog.youkuaiyun.com/mengxianglong123/article/details/88559138 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。 请求-响应”模式: 1. Socket类:发送TCP消息。 2. ServerSock

weixin_42134712的博客 382

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java实现基于TCP协议的Socket通信

Java实现基于TCP协议的Socket通信 去发现同类优质开源项目:https://gitcode.com/ 此仓库包含了一个Java语言编写的Socket通信项目,主要实现了以下功能: 服务器和客户端之间的连接通信。 客户端与客户端之间的连接通信。 通过该项目,您可以学习到如何使用Java语言实现基于TCP协议的Socket通信,掌握服务器与客户端的交互机制,以及如何在客户端之间进行通信。...

gitblog_06776的博客 377

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java中使用TCP协议的Socket通信

使用TCP的Socket通信: 基本测试代码: 客户端: package tcpsocket; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /* 客服端: 创建Socket连接服务器(指定IP地址,端口号) 调用Socket的getInputStream()和getOutputStream()方法获取输入输出流 输入流可以读取服务器

pipizhen_的博客 711

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java Socket通信——TCP协议(二)

如何实现客户端和服务端的互相通信呢?也就是服务端也可以发送消息给客户端,客户端也可以处理消息,就像QQ聊天一样。 客户端代码: public class TcpClient { public static void main(String[] args) throws IOException { //需求:客户端发送数据给服务端,并读取服务端反馈的数据 //1、创建Socket客

mutoujian126的专栏 620

java socket 通信协议_使用java如何实现基于TCP协议网络socket编程

使用java如何实现基于TCP协议网络socket编程发布时间:2020-10-31 01:23:16来源:亿速云阅读:118作者:Leah使用java如何实现基于TCP协议网络socket编程?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、前言:TCP原理简介首先,保证文章完整性,TCP的理论原理还是需要简介一下,略显枯燥๑乛...

weixin_32660773的博客 544

Java之基于tcp协议的socket通信

在java网络编程中包含两种方式,Socket(TCP)和DatagramSocket(UDP)。 在网络编程中常用的三个类 InetAddress:用于标识网络上的硬件资源; Socket:使用TCP协议实现网络通信的Socket相关的类; DatagramSocket:使用UDP协议将数据存在数据报中通过网络进行通信; Socket和DatagramSocket的区别 Socket使用的tcp连接,需要先连接之后才能发送数据; DatagramSocket使用的UDP连接,客户端不需要先连接数据,可以直

ldcaws的专栏 2482

java socket 通信协议_7.6.2 基于TCP协议的Socket通信(1)

本节引言:上一节的概念课枯燥无味是吧,不过总有点收获是吧,本节开始我们来研究基于TCP协议的Socket通信,先来了解下Socket的概念,以及Socket通信的模型,实现Socket的步骤,以及作为Socket服务端与客户端的两位各做要做什么事情!好的,我们由浅入深来扣这个Socket吧!1.什么是Socket?2.Socket通信模型:Socket通信实现步骤解析:Step 1:创建Serve...

weixin_29426299的博客 221

Java 基于TCP协议的Socket编程和通信

在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。 请求-响应”模式: 1. Socket类:发送TCP消息。 2. ServerSocket类:创建服务器。 套接字是一种进程间的数...

mengxianglong123的博客 7571
上一篇: JPype:实现在python中调用JAVA
下一篇: 关于绑定IP地址与端口号的见解
THMAIL
博客等级 码龄10年 2434粉丝 432原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值