java 通过socket实现TCP编程的例子

2018-12-26  本文已影响0人  寻找大海的鱼

1.服务端
ServerThread类

/**
 * 该类为多线程类,用于服务端
 */
public class ServerThread implements Runnable {

    private Socket client = null;

    public ServerThread(Socket client) {
        this.client = client;
    }


    public void run() {
        try {
            //获取Socket的输出流,用来向客户端发送数据
            char[] b = new char[400];
            PrintStream out = new PrintStream(client.getOutputStream());
            //获取Socket的输入流,用来接收从客户端发送过来的数据
            BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
            boolean flag = true;
            while (flag) {
                //接收从客户端发送过来的数据
                Integer len = buf.read(b);

                String str = new String(b, 0, len);
             
                System.out.println(str);
           
                if (str == null || "".equals(str)) {
                    flag = false;
                } else {
                    if ("bye".equals(str)) {
                        flag = false;
                    } else {
                        //将接收到的字符串前面加上echo,发送到对应的客户端
                        out.println("echo:" + str);
                    }
                }
            }
            out.close();
            client.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

启动类

public class Main {
    public static void main(String[] args) throws Exception {
        //服务端在12345端口监听客户端请求的TCP连接
        ServerSocket server = new ServerSocket(12345);
        Socket client = null;
        boolean f = true;
        while (f) {
            //等待客户端的连接,如果没有获取连接
            client = server.accept();
            System.out.println("与客户端连接成功!");
            //为每个客户端连接开启一个线程
            new Thread(new ServerThread(client)).start();
        }
        server.close();
    }

}

2.测试服务端程序
启动服务端程序
打开调试助手,配置好IP和端口号,连接如下图


调试助手.jpg
服务端.jpg

然后通过调试助手向服务端发送1234


测试.jpg
服务端程序接收到信息1234,并返回“echo”+1234给客户端网络调试助手,成功!
客户端发送bye可结束通信连接。
3.编写Java客户端程序
public class Client1 {
    public static void main(String[] args) throws IOException {
        //客户端请求与本机在12345端口建立TCP连接
        Socket client = new Socket("127.0.0.1", 12345);          
        client.setSoTimeout(20000);
        //获取键盘输入
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        //获取Socket的输出流,用来发送数据到服务端
        PrintStream out = new PrintStream(client.getOutputStream());
        //获取Socket的输入流,用来接收从服务端发送过来的数据
        BufferedReader buf =  new BufferedReader(new InputStreamReader(client.getInputStream()));
        boolean flag = true;
        while(flag){
            System.out.print("输入信息:");
            String str = input.readLine();
            //发送数据到服务端
            out.println(str);
            if("bye".equals(str)){
                flag = false;
            }else{
                try{
                    //从服务器端接收数据有个时间限制(系统自设,也可以自己设置),超过了这个时间,便会抛出该异常
                    String echo = buf.readLine();
                    System.out.println(echo);
                }catch(SocketTimeoutException e){
                    System.out.println("Time out, No response");
                }
            }
        }
        input.close();
        if(client != null){
            //如果构造函数建立起了连接,则关闭套接字,如果没有建立起连接,自然不用关闭
            client.close(); //只关闭socket,其关联的输入输出流也会被关闭
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读