zoukankan      html  css  js  c++  java
  • tcp通信

    2.创建ServerSocket的同时向系统申请对外的服务端口。注意, 该端口不能和其他程序冲突,否则会抛出地址被占用的异常

    3.运行在服务端的服务端接口,客户端就是通过这个端口与服务端建立连接的。

    监听服务端口,等待客户端连接。一旦一个客户端通过Socket与服务端建立连接,那么serversocket

    会创建一个socket与该客户端通讯。

    4.ServerSocket提供方法:

    Socket accept()
     该方法是一个阻塞方法,调用后即等待客户端的链接;一旦一个
     客户端连接,那么accept方法就会返回一个Socket实例,通过
     这个实例就可以与刚连接的客户端交互了

    5.Socket,ServerSocket的对象可以在类的构造中创建。服务端创建ServerSocket,通过server.accept()监听客户端,客户端创建Socket。

    一、向服务端发送一句:你好,客户端

    服务端代码:

    package day01;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * 服务端
     * @author TEDU
     *
     */
    public class Server {
        private ServerSocket server;
        public Server() throws IOException{
            //初始化服务端,参数为监听的端口号
            server=new ServerSocket(8098);
        }
        public void start(){
            try {
                System.out.println("等待客户端连接");
                Socket socket=server.accept();//监听客户端,此时进入阻塞状态
                System.out.println("一个客户端已连接");//表示已经完成了客户端的连接
                while(true){//当客户端连接后会自动停止,while true让服务端一直接收消息状态
                    InputStream nm=socket.getInputStream();
                    InputStreamReader mo=new InputStreamReader(nm,"UTF-8");
                    BufferedReader bi=new BufferedReader(mo);
                    String st=bi.readLine();
                    if(st!=null){//信息如果不筛选就会在控制台一直输出null
                        System.out.println("客户端说:"+st);
                    }
                    
                }
            } catch (IOException e) {
            
                e.printStackTrace();
            }
        }
    public static void main(String[] args){
        try {
            Server a=new Server();
            a.start();//启动程序
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    }

    客户端代码:

    package day01;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;
    /**
     * 客户端
     * @author TEDU
     *
     */
    public class Client {
        private Socket socket;
        public Client(){
            try {
                socket=new Socket("localhost",8098);
                System.out.println("连接服务器成功");
            } catch (UnknownHostException e) {
                
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public void start(){
            try {
                OutputStream in=socket.getOutputStream();
                OutputStreamWriter oi=new OutputStreamWriter(in,"UTF-8");
                PrintWriter an=new PrintWriter(oi,true);
                String st="你好客户端";
                an.println(st);
                socket.close();//如果不关闭socket会导致异常
            } catch (Exception e) {
            }
        }
    public static void main(String[] args) {
        try {
            Client client=new Client();
            client.start();
        } catch (Exception e) {
            System.out.println("客户端启动失败");
        }
    }
    }

    二、通过控制台向服务端发消息

    客户端代码:

    (服务端代码不变)

    package day01;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Scanner;
    /**
     * 客户端
     * @author TEDU
     *
     */
    public class Client {
    	private  Socket socket;
    	Scanner scan;
    	public Client(){
    		try {
    			socket=new Socket("localhost",8098);
    			System.out.println("连接服务器成功");
    		} catch (UnknownHostException e) {
    			
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	public void start(){
    		try {
    			System.out.println("开始聊天吧");
    			scan=new Scanner(System.in);
    			while(true){
    				OutputStream in=socket.getOutputStream();
    				OutputStreamWriter oi=new OutputStreamWriter(in,"UTF-8");
    				PrintWriter an=new PrintWriter(oi,true);
    				String st=scan.nextLine();
    				an.println(st);
    				
    			}
    			
    		} catch (Exception e) {
    		}
    		try {
    			socket.close();
    			scan.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}//如果不关闭socket会导致异常
    	}
    public static void main(String[] args) {
    	try {
    		Client client=new Client();
    		client.start();
    		
    		
    	} catch (Exception e) {
    		System.out.println("客户端启动失败");
    	}
    }
    }
    

      

  • 相关阅读:
    Educational Codeforces Round 83 --- F. AND Segments
    Educational Codeforces Round 83 --- G. Autocompletion
    SEERC 2019 A.Max or Min
    2019-2020 ICPC Southwestern European Regional Programming Contest(Gym 102501)
    Educational Codeforces Round 78 --- F. Cards
    今天我学习了一门全新的语言
    codeforces 1323D 题解(数学)
    Educational Codeforces Round 80 (Div. 2) 题解 1288A 1288B 1288C 1288D 1288E
    Educational Codeforces Round 81 (Div. 2) 题解 1295A 1295B 1295C 1295D 1295E 1295F
    Codeforces Round #617 (Div. 3) 题解 1296C 1296D 1296E 1296F
  • 原文地址:https://www.cnblogs.com/chenzhiwei/p/9495257.html
Copyright © 2011-2022 走看看