
基于TCP的网络编程 基于TCP的Scoket通讯模型
发布日期:2022-02-01 14:28:21
浏览次数:33
分类:技术文章
本文共 4645 字,大约阅读时间需要 15 分钟。
1.概念
TCP:Transmission Control Protocol,传输控制协议,基于字节流的传输层通信协议。
特点: 1.面向连接 2.安全、可靠 3.传输数据大小限制,一旦连接建立,双方可以按统一的格式传输任意多的数据。 4.效率低
TCP的三次握手
a.客户端向服务端发送一个请求 b.服务端收到请求后,回客户端一个响应 c.客户端向收到服务端的响应后,回服务端一个确认信息
2.基于TCP的Socket(套接字)通信模型
Socket是操作系统提供的一种底层的通信机制,Java仅仅是对底层的socket的一种封装。供开发人员方便使用。具体模型如下图:

3.Socket和ServerSocket
ServerSocket表示服务端的套接字,Socket代表客户端的套接字,通常是客户端发送消息,服务端接收消息。
服务端执行具体步骤:
- 服务器端:
- 编程步骤:
- 1 创建服务器套接字,并指定端口号
- 2 接受客户端连接,并返回客户端套接字
- 3 获取输入输出流
- 4 处理
- 5 关闭 客户端通常就四个步骤: 1.创建客户端套接字,并指定服务器地址和端口号 2.获取输入或者输出流 3.处理 4.关闭
具体代码如下:
客户端:public class TcpClient { public static void main(String[] args) throws Exception { //1.创建客户端套接字,并指定服务器地址和端口号 Socket socket=new Socket("10.9.21.248",8888); //2.获取输入或者输出流 //客户端是向服务端发消息 输出 //3.处理 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter( socket.getOutputStream())); bw.write("你好吗"); bw.newLine();//注意注意注意 一定要换行 readline读到换行符才能结束 后面.close()会有换行符 不加的读到close才换行 bw.flush(); //接收服务端回复 BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); String s = br.readLine(); System.out.println("服务端回复:"+s); //4.关闭 br.close(); bw.close(); socket.close(); }}
服务端代码:
public class TcpServer { public static void main(String[] args) throws Exception { //1.创建服务器套接字,并指定端口号 ServerSocket listener=new ServerSocket(8888); System.out.println("服务端已启动..."); //2 接受客户端连接,并返回客户端套接字 Socket socket = listener.accept();//返回的是客户端套字 //3. 获取输入输出流 //4 处理 BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); String line=br.readLine(); System.out.println("客户端说"+line); //服务端回复客户端 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter( socket.getOutputStream())); bw.write("我很好,谢谢"); bw.newLine(); bw.flush(); // 5 关闭 bw.close(); br.close(); socket.close(); listener.close(); }}
当客户端向服务端传送的不是字符消息时候,比如传图片或者音频,则必须用字节流来处理,客户端传图片:
public class FileClient { public static void main(String[] args) throws Exception { Socket socket=new Socket("10.9.21.248",8888); BufferedInputStream bis=new BufferedInputStream(new FileInputStream("ccc.png")); BufferedOutputStream bos=new BufferedOutputStream(socket.getOutputStream()); byte[] buf=new byte[1024]; int len=-1; while ((len=bis.read(buf))!=-1){ bos.write(buf,0,len); } bis.close(); bos.close(); socket.close(); System.out.println("传输完毕"); }}//下面是不带缓冲的代码方法 /* public static void main(String[] args) throws Exception { //1创建socket Socket socket=new Socket("10.9.21.146", 8888); //2获取输出流 OutputStream os = socket.getOutputStream(); //3读取文件并输出 FileInputStream fis=new FileInputStream("copy.jpg"); byte[] buf=new byte[1024]; int len=-1; while((len=fis.read(buf))!=-1){ os.write(buf,0,len); os.flush(); } //4关闭 fis.close(); os.close(); socket.close(); System.out.println("发送完毕"); }}*/
服务端接收图片:
public class FileServer { public static void main(String[] args) throws Exception { ServerSocket listener=new ServerSocket(8888); System.out.println("服务器启动"); Socket socket = listener.accept(); InputStream inputStream = socket.getInputStream(); BufferedInputStream bis=new BufferedInputStream(inputStream); BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("d:\\xuexi.png")); byte [] buf=new byte[1024]; int b=-1; while ((b=bis.read(buf))!=-1){ bos.write(buf,0,b); bos.flush(); } System.out.println("服务器接收完毕"); bos.close(); bis.close(); socket.close(); listener.close(); }}//下面不带缓冲的普通方法/* public static void main(String[] args) throws Exception { //1创建ServerSocket 并指定端口号 ServerSocket listener=new ServerSocket(8888); //2侦听,返回客户端套接字 System.out.println("服务器已启动....."); Socket socket = listener.accept(); //3获取输入流 InputStream is = socket.getInputStream(); FileOutputStream fos=new FileOutputStream("d:\\aaa.jpg"); byte[] buf=new byte[1024]; int len=-1; //4读取数据 while((len=is.read(buf))!=-1){ fos.write(buf,0,len); } //5关闭 fos.close(); is.close(); socket.close(); listener.close(); System.out.println("接受完毕"); }}*/
主要代码就是利用流来进行文件传输,通过套接字来连接彼此之间桥梁。
转载地址:https://blog.csdn.net/shunshizhen120412/article/details/99344741 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2023年05月23日 13时15分45秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
最新文章
HDU 3308 LCIS
2019-07-09 05:52:48
浅析地方门户网优化的方法
2019-07-09 05:52:48
什么是.Net的异步机制(Invoke,BeginInvoke,EndInvoke) - step 2
2019-07-09 05:52:47
什么是IPsec
2019-07-09 05:52:47
HDU 3278 Puzzle (蛋疼。。。。)
2019-07-09 05:52:46
网络编程(二):有多少资源,需要关闭
2019-07-09 05:52:46
文件读取,保存操作
2019-07-09 05:52:45
电子书下载:Microsoft Visual C# 2010 Step by Step
2019-07-09 05:52:45
Asp.Net MVC 4 Web API 中的安全认证-使用OAuth
2019-07-09 05:52:44
如何关注那些有价值的微博
2019-07-09 05:52:44
ASP.NET 使用PageBase来控制用户登陆
2019-07-09 05:52:43
(筆記) fmax的計算公式 (SOC) (Quartus II)
2019-07-09 05:52:43
负载均衡下 tomcat session 共享
2019-07-09 05:52:42
mysql 比较函数和操作符
2019-07-09 05:52:42
进程管理利器Supervisor--入门简介
2019-07-09 05:52:42
工控随笔_15_西门子_WinCC的VBS脚本_05_变量类型之三_VBS数组
2019-07-09 05:52:41
Idea开启Run DashBoard配置
2019-07-09 05:52:41
linux 监控性能学习笔记(1)
2019-07-09 05:52:40
180418
2019-07-09 05:52:40
Silverlight & Blend动画设计系列一:偏移动画(TranslateTransform)
2019-07-09 05:52:39