基于TCP的网络编程 基于TCP的Scoket通讯模型
发布日期:2022-02-01 14:28:21 浏览次数:42 分类:技术文章

本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:详细的java单例模式线程安全问题详解
下一篇:基于UDP的网络编程,DatagramSocket和DatagramPacket

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月07日 06时38分01秒