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("客户端启动失败");
    	}
    }
    }
    

      

  • 相关阅读:
    适用于Bash编程初学者小例子
    Linux下的压缩与解压命令速查
    Linux下拷贝一个带有soft link的dir,会把被link的内容也拷贝过来吗?
    适用于Bash编程初学者小例子
    从一个git仓库迁移代码到另一个git仓库(亲测有效版)(转)
    海量数据面试题(附题解+方法总结)(转)
    leetcode刷题(六)路径总和I、II、III(转)
    浅谈AVL树,红黑树,B树,B+树原理及应用(转)
    [LeetCode] 860. Lemonade Change 买柠檬找零(转)
    [leetcode] 134. Gas Station 解题报告(转)
  • 原文地址:https://www.cnblogs.com/chenzhiwei/p/9495257.html
Copyright © 2011-2022 走看看