• 实验09——java基于TCP实现客户端与服务端通信


    TCP通信
            需要先创建连接 - 并且在创建连接的过程中 需要经过三次握手
            底层通过 流 发送数据 数据没有大小限制
            可靠的传输机制 - 丢包重发 包的顺序的保障
            传输速度相对比较慢
            对于速度要求不太高 但是对可靠性要求比较高的场景下 - 文件上传 下载

            因为TCP在通信的过程中 是需要创建连接的 连接的发起者称为客户端 监听端口等待被连接的一端称为服务端

    1、客户端:Client.java

    package ChatRoom.v3;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.Scanner;
    
    /**
     * @author 赵瑞鑫 E-mail:1922250303@qq.com
     * @version 1.0
     * @创建时间:2020年8月3日 下午4:38:50
     * @类说明: 服务端
     */
    public class Client {
    	private static Socket socket;
    	private static String cli = "客户端:";
    	private static OutputStream out;
    	private static InputStream in;
    	private static PrintWriter pw;
    	private static BufferedReader br;
    
    	public Client() {
    		try {
    			socket = new Socket("127.0.0.1", 8888);
    			System.out.println(cli + "套接字创建成功");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	public static void start() {
    		// 1、套接字对象
    		try {
    
    			while (true) {
    				// 2、获取输出流,写信息
    				out = socket.getOutputStream();
    
    				// 3、获取输入流,读信息
    				in = socket.getInputStream();
    				br = new BufferedReader(new InputStreamReader(in));
    				while (true) {
    					System.out.println("input:");
    					Scanner sc = new Scanner(System.in);
    					String msg = sc.next();
    					pw = new PrintWriter(out);
    					pw.println(msg);
    					pw.flush();
    					msg = br.readLine();
    					System.out.println(msg + "
    ");
    
    				}
    			}
    
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		// 4、关闭流
    		try {
    			socket.close();
    			out.close();
    			pw.close();
    			in.close();
    			br.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Client client = new Client();
    		client.start();
    	}
    
    }
    

     2、服务端:Server.java

    package ChatRoom.v3;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author 赵瑞鑫 E-mail:1922250303@qq.com
     * @version 1.0
     * @创建时间:2020年8月3日 下午4:38:36
     * @类说明: 客户端 端口号:8888
     */
    public class Server {
    	private static ServerSocket serversocket;
    	private static Socket socket;
    	private static String ser = "服务端:";
    	private static OutputStream out;
    	private static InputStream in;
    	private static PrintWriter pw;
    	private static BufferedReader br;
    
    	public Server() {
    		try {
    			serversocket = new ServerSocket(8888);
    			System.out.println(ser + "套接字创建成功");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    
    	public static void start() {
    		// 1、套接字对象
    		try {
    
    			while (true) {
    				// 2、调用accept方法,接收请求
    				socket = serversocket.accept();
    				System.out.println(ser + "已接收请求,等待处理");
    				// 3、获取输入流对象,读客户端数据
    				in = socket.getInputStream();
    				BufferedReader br = new BufferedReader(new InputStreamReader(in));
    				while (true) {
    					String msg = br.readLine();
    					System.out.println(ser + "处理成功,请等待");
    					// 4、处理后的数据通过输出流写出去
    					out = socket.getOutputStream();
    					pw = new PrintWriter(out);
    					pw.println(ser + msg);
    					pw.flush();
    				}
    
    			}
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		// 5、关闭流和套接字对象
    		try {
    			serversocket.close();
    			br.close();
    			pw.close();
    			socket.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Server server = new Server();
    		server.start();
    	}
    
    }
    

            实现客户端与服务端的通信是后续实现多人聊天室的基础,理清socket编程和输入输出流的使用非常重要。

    作者:赵瑞鑫。支持原创,从你我做起。
  • 相关阅读:
    从安装.net Core 到helloWord(Mac上)
    阿里云-对象储存OSS
    图片处理
    项目中 添加 swift代码 真机调试 错误
    iOS面试总结
    IOS APP配置.plist汇总
    cocoapods安装问题
    iOS8使用UIVisualEffectView实现模糊效果
    ios键盘回收终极版
    ?C++ 缺少参数的默认参数
  • 原文地址:https://www.cnblogs.com/Winer-Jiu/p/13428215.html
Copyright © 2020-2023  润新知