TCP通信客户端和服务器端网络编程

一 客户端和服务器端通信的步骤

二 TCP通信的客户端网络编程

TCP协议是严格区分客户端和服务器端的

1. TCP通信的客户端

  • 向服务器端发送连接请求
  • 给服务器端发送数据
  • 读取服务器端回写的数据

2. 在Java中,提供了java.net包下的Socket类来表示客户端。Socket也叫"套接字",包含了IP地址和端口号

3. Socket的构造方法

  • public Socket(String host,int port) throws UnknownHostException, IOException
  • 构造方法的参数:host表示服务器主机的名称或者IP地址,port表示服务器端的端口号
  • 当执行Socket的构造方法创建Socket对象时,会通过三次握手去建立和服务器端的连接,如果连接失败,会抛出异常

4. 经常使用的成员方法

  • public OutputStream getOutputStream() throws IOException :给这个Socket对象返回一个OutputStream用于向服务器端发送数据
  • public InputStream getInputStream() throws IOException :给这个Socket对象返回一个InputStream用于读取服务器端回写的数据
  • public void close() throws IOException 关闭这个Socket对象

5. TCP通信的客户端网络编程的实现步骤

  • 创建一个客户端Socket对象,构造方法绑定服务器短的IP地址和端口号
  • 调用Socket对象的getOutputStream()方法,获得网络字节输出流OutputStream对象
  • 调用OutputStream对象的write()方法向服务器端发送数据
  • 调用Socket对象的getInputStream()方法,获得网络字节输入流InputStream对象
  • 调用InputStream对象的read()方法读取服务器端发送的回写数据
  • 释放资源(调用Socket对象的close()方法)

6. 注意事项

  • 客户端和服务器端进行通信的时候,必须使用Socket对象提供的网络流,不能使用自己创建的流对象
  • 当我们创建客户端Socket对象的时候,就会使用提供的IP地址和端口号通过三次握手和服务器端建立连接,如果说服务器端没有启动,建立连接失败,就会抛出异常;如果服务器端已经启动并且成功建立连接,那么就可以进行通信了。

7. TCP通信的客户端网络编程的实现

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;public class TCPClient {public static void main(String[] args) throws UnknownHostException, IOException {String host="127.0.0.1";//服务器端IP地址int port=8888;//服务器端端口号//创建客户端Socket对象,绑定服务器端的IP地址和端口号Socket socket=new Socket(host, port);//使用Socket对象获取网络输出流OutputStream对象OutputStream os =socket.getOutputStream();//通过OutputStream对象的write()方法向服务器端发送数据os.write("你好,服务器".getBytes());//使用Socket对象获取网络输出流InputStream对象InputStream is =socket.getInputStream();//通过InputStream对象的read()方法读取服务器端回写的数据byte[] data=new byte[2014];int len=is.read(data);System.out.println("服务器端回写的数据:"+new String(data, 0, len));//释放资源socket.close();}
}

三 TCP通信的服务器端网络编程

TCP协议是严格区分客户端和服务器端的

1. TCP通信的服务器端

  • 接收客户端的请求
  • 读取客户端发送的数据
  • 给客户端回写数据

2. 在Java中,提供了java.net包下的ServerSocket类来表示服务器端。ServerSocket也叫"服务器端套接字"

3. ServerSocket的构造方法

  • public ServerSocket(int port,int backlog,InetAddress bindAddr)throws IOException:创建绑定到指定端口号的ServerSocket对象

  • 构造方法的参数:port表示向系统要指定的端口号

4. 经常使用的成员方法

  • public Socket accept() throws IOException 通过accept()方法监听来自客户端的请求,如果监听到来自客户端的请求,则返回客户端的Socket对象

  • public void close() throws IOException 关闭这个ServerSocket对象

5. TCP通信的客户端网络编程的实现步骤

  • 创建一个服务器端的ServerSocket对象,并向系统要一个指定的端口号
  • 使用ServerSocket对象的accept()方法监听客户端的请求,如果监听到则返回客户端Socket对象
  • 使用客户端Socket对象的getInputStream()方法,获得网络字节输入流InputStream对象
  • 调用InputStream对象的read()方法读取客户端发送的数据
  • 使用客户端Socket对象的getOutputStream()方法,获得网络字节输出流OutputStream对象
  • 调用OutputStream对象的write()方法向客户端发送回写数据
  • 释放资源(调用Socket对象的close()方法,调用ServerSocket对象的close()方法)

6. 注意事项

  • 服务器端必须明确是哪个客户端发送的请求,使用accept()方法获取客户端的Socket对象

7. TCP通信的服务器端网络编程的实现

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class TCPServer {public static void main(String[] args) throws IOException {//创建一个服务器端的ServerSocket对象,并向系统要一个指定的端口号ServerSocket serverSocket=new ServerSocket(8888);//使用ServerSocket对象的accept()方法监听客户端的请求,如果监听到则返回客户端Socket对象Socket socket=serverSocket.accept();//使用客户端Socket对象的getInputStream()方法,获得网络字节输入流InputStream对象InputStream is=socket.getInputStream();//调用InputStream对象的read()方法读取客户端发送的数据byte[] data=new byte[2048];int len=is.read(data);System.out.println("接受到的客户端发送的数据:"+new String(data, 0, len));//使用客户端Socket对象的getOutputStream()方法,获得网络字节输出流OutputStream对象OutputStream os=socket.getOutputStream();//调用OutputStream对象的write()方法向客户端发送回写数据os.write("你好,客户端,我已成功接受数据".getBytes());socket.close();serverSocket.close();}
}

四 TCP通信的综合案例:文件上传的原理

1. 客户端实现

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;public class TCPClient {public static void main(String[] args) throws UnknownHostException, IOException {//创建本地字节输入流,并绑定数据源String filename="F:\\016.jpg";FileInputStream fis=new FileInputStream(filename);//创建客户端Socket对象,并绑定服务器端的IP地址和端口号Socket socket=new Socket("127.0.0.1", 8888);//获取Socket对象的OutputStream对象OutputStream os=socket.getOutputStream();byte[] bytes=new byte[1024];int len=0;while((len=fis.read(bytes))!=-1) {os.write(bytes,0,len);}socket.shutdownOutput();//获取Socket对象的InputStream对象InputStream is=socket.getInputStream();while((len=is.read(bytes))!=-1) {System.out.println("服务器端回写的数据是:"+new String(bytes, 0, len));}fis.close();socket.close();}
}

2. 服务器端实现

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;import com.donglijiedian.thisDemo.Date;public class TCPServer {public static void main(String[] args) throws IOException {//创建一个ServerSocket对象,并向系统要指定的端口号ServerSocket serverSocket = new ServerSocket(8888);while (true) {//通过accept方法对客户端进行监听,获取客户端SocketSocket socket=serverSocket.accept();Thread thread=new Thread(new Runnable() {@Overridepublic void run() {try {//获取客户端Socket对象的InputStreamInputStream is=socket.getInputStream();//判断文件是否存在File file=new File("F:\\photo");String filename="F:\\photo"+"\\"+(new Date())+".jpg";if (!file.exists()) {file.mkdir();}//创建本地输出流对象FileOutputStream fos=new FileOutputStream(filename);byte[] bytes=new byte[2014];int len=0;while((len=is.read(bytes))!=-1) {//向本地写文件fos.write(bytes,0,len);}//获取Socket对象的OutputStreamOutputStream os=socket.getOutputStream();//给客户端回写数据os.write("服务器端成功接受到数据:".getBytes());fos.close();socket.close();} catch (Exception e) {System.out.println(e);}}});thread.start();}}
}

五 模拟BS服务器

1. 客户端访问服务器端的流程

2. 服务器端的实现

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37798.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

收发Hotmail和Yahoo邮件

Hotmail和Yahoo作为国际性的电子邮箱提供商,凭借着完全免费的服务策略和优良的稳定性吸引了大量的用户。可是无法直接用Foxmail等邮件客户端软件收发Hotmail和Yahoo邮箱中的邮件也一直是一个困扰大家的问题。其实,只要进行一些必要的设置,我们…

记录下javaMail发送邮件遇到的问题-(邮件中文昵称)

最近在做邮箱功能,其中发件时也需要记录下邮箱的昵称,所以代码中的邮箱地址前会有中文昵称,这也导致邮件发送失败 后台显示邮件发送成功,但是却被退回 Mail delivery failed: returning message to sender 其中,收件地…

格子达ai辅助降重:查看相关的ai报告

五月毕业季,很多同学都会出现ai辅助过高的情况,但是学校的格子达里面却没有ai句子分析。接下来告诉大家如何免费使用ai分析: 一、第一步点击下方连接注册一个自己的账号 https://www.gezida.com//checkReport/aiShare.do?sourceKeyd924bb0…

GTC 火山引擎线上专场 | 解码字节跳动多场景技术内核及应用

活动简介 12 月 19 日,GTC 智能增长技术专场,火山引擎将以「智能增长」为主题,为大家带来字节跳动在机器学习领域沉淀的技术经验,智能平台、数据智能、语音识别、联邦学习等场景的前沿应用,以及通过火山引擎这一平台在…

元宇宙新星升起,华英会加入NFT混战

如果说起2021这一年,那么有两个关键词一定会被提及,“新冠疫情”以及“元宇宙”,除了路人皆知的诸如facebook这样的互联网巨头们纷纷抢占风口,扩张地盘之外,通过相关区块链工具以及交易数据,我们还发现,一些低调的乃至神秘的公司及团体也正在这个新晋热点上,悄悄的开始了他们的…

专注于元宇宙实际应用方案的企业

元宇宙的话题持续火热。国内互联网大厂正在加大对元宇宙相关技术和应用的研发,元宇宙正在逐步成为创新创业的主战场。企业元宇宙在教育、会展、文创、旅游、博物馆、文化艺术、娱乐、社交、版权、零售等等领域发力,增加客户对企业的认同。 也许未来只需一…

Mixlab 在元宇宙盘了块 “地” 正式进军元宇宙

Mix 「 据 2022-1-19 微软官方新闻稿 」 微软(纳斯达克股票代码:MSFT)宣布收购游戏开发和互动娱乐内容发行商公司动视暴雪 Activision Blizzard Inc.(ATVI)。微软以每股 95.00 USD 的价格收购动视暴雪,总收…

c语言实现文件管理系统(对文本内内容操作)

文件管理系统 代码思路 1、利用两个文本文件,一个文本文件保存需要的数据,另一个保存需要处理的数据,对需要处理的文本内容进行最小值,最大值,平均值的求解。 2、把处理的数据存入数组,转化性质&#xff…

ChatGPT win下C语言串口通信

文章目录 1.ChatGPT2.对ChatGPT进行代码封装 关键词&#xff1a;win环境 C语言 串口通信 ChatGPT 1.ChatGPT - com<com9可以用直接赋值 COMx - com>com9需要 \\\\.\\COMx 重点//eg:COM1&#xff0c;COM2 , COM10 use \\\\.\\COM10ChatGPT&#xff1a;Write a serial c…

c#实现QQ群成员列表导出及邮件群发之模拟QQ登陆

前言 本文的重要部分&#xff1a; 1、抓包获取QQ空间或者邮箱登陆地址&#xff0c;分析参数&#xff0c;用户名&#xff0c;密码&#xff0c;验证码&#xff0c;gtk&#xff0c;随即数。 2、获取每次登陆需要的验证码 3、用户名&#xff0c;密码&#xff0c;验证码加密得到登陆…

快速导出qq群所有qq号码

打开http://qun.qq.com/member.html 登录自己的qq 登录以后的页面 选择要导出的qq群 然后按F12(打开开发者模式) 将下面的代码复制到控制台后敲回车执行即可。 function savefiles(data, name) {var urlObject = window.URL || window.webkitURL || window;var export_b…

​GPT-3好“搭档”:这种方法缓解模型退化,让输出更自然

文本生成对于许多自然语言处理应用来说都是非常重要的。 但神经语言模型的基于最大化的解码方法&#xff08;如 beam search&#xff09;往往导致退化解&#xff0c;即生成的文本是不自然的&#xff0c;并且常常包含不必要的重复。现有的方法通过采样或修改训练目标来引入随机…

技术创新,让企业拥有智能“伯乐”,实现精准识人

过去&#xff0c;“得人才者得天下&#xff0c;世有伯乐&#xff0c;然后有千里马。” 这些都是我们耳熟能详古人对于人才渴求的描写。能否及时发现人才、培养人才、发挥人才作用的关键&#xff0c;都是历代管理者或经营者关注的问题。自古发现人才并没有那么容易&#xff0c;过…

LLM in Medical Domain: 一文速览大语言模型在医学领域的应用

© 作者&#xff5c;杨锦霞 机构&#xff5c;中国人民大学 研究方向&#xff5c;多模态学习 来自&#xff1a;RUC AI Box 进NLP群—>加入NLP交流群 引言&#xff1a;近期&#xff0c;大型语言模型在各种任务上展现出优异的性能&#xff0c;展示了广阔的应用前景。然而&a…

【NLP】首个支持联网的中文 AI 问答模型,开源了!

2021 年 12 月&#xff0c;OpenAI 正式推出 WebGPT&#xff0c;该项目的横空出世&#xff0c;标志着基于网页搜索的问答新范式的诞生。 在此之后&#xff0c;New Bing 首先将网页搜索功能整合发布&#xff0c;随后 OpenAI 也发布了支持联网的插件 ChatGPT Plugins。 大模型在联…

清华ACL2023 | WebCPM:首个联网支持中文问答开源模型

来自&#xff1a;PaperWeekly 进NLP群—>加入NLP交流群 2021年12月 WebGPT 的横空出世标志了基于网页搜索的问答新范式的诞生&#xff0c;在此之后&#xff0c;New Bing 首先将网页搜索功能整合发布&#xff0c;随后 OpenAI 也发布了支持联网的插件 ChatGPT Plugins。大模型…

刚刚!马斯克开源Twitter算法,GitHub Star数已破万!

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年2月份热门报告合集 ChatGPT种子用户招募&#xff08;无限制次数直接使用&#xff09; ChatGPT调研报告&#xff08;仅供内部参考&#xff09; 文心一言、GPT3.5及GPT4…

招募:AICG内容联合创作计划 | AIGC实践

AIGC&#xff08;AI Generated Content&#xff0c;人工智能自动生成内容&#xff09;必将成为小微创业团队进行低成本内容运营的最佳实践。 你同意这个观点吗&#xff1f; 如果我们恰好想法一致&#xff0c;或许可以一起搞点事情&#xff0c;探索一下商业场景下&#xff0c;应…

【原创】实现ChatGPT中Transformer模型之输入处理

作者&#xff1a;黑夜路人 时间&#xff1a;2023年7月 Inputs Process&#xff08;输入处理层&#xff09;实现 我们看整个绿色框的整个位置&#xff0c;就是Inputs Process&#xff08;输入处理层&#xff09;。 在输入处理层&#xff0c;其实非常容易理解&#xff0c;主要就…

Visual Studio Community 2022 + Win10 编译 OpenCPN 5.9.0 记录

前言 前两天尝试用vs2017编译OpenCPN5.0.0&#xff0c;前后折腾了两三天总算编译成功了。官网给出的编译过程比较简单&#xff0c;我在实际编译过程中遇上了很多很多的问题&#xff0c;最多的就是缺少库&#xff0c;好在最后编译通过了。 后来浏览OpenCPN官网的时候发现发布了…