zoukankan      html  css  js  c++  java
  • 实验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编程和输入输出流的使用非常重要。

    作者:赵瑞鑫。支持原创,从你我做起。
  • 相关阅读:
    14个以春天为主题的网页设计
    使用 CSS3 创建下拉菜单
    视觉灵感:30个漂亮的的网站设计
    Null Object设计模式
    js插件库之图像幻灯片和画廊
    C#读取HTML文件内容写入记事本
    最好的图片水印实现思路
    抽奖系统
    对过万条数据的数据库字段内容批量替换程序
    通用 图片/文字 水印函数
  • 原文地址:https://www.cnblogs.com/Winer-Jiu/p/13428215.html
Copyright © 2011-2022 走看看