TCP/IP 通信协议之socket

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

下面写了一个简单的例子,有助于更好的理解。

服务端代码实现

package test.socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class SocketServer {
    public static String timeStyle = "yyyy-MM-dd HH:mm:ss SSS";
    public static SimpleDateFormat format = new SimpleDateFormat(timeStyle);
    // 设置超时间
    public static int timeout = 10;
 
    public static void main(String[] args) {
        System.out.println("----------Server----------");
        System.out.println(format.format(new Date()));
 
        ServerSocket server;
        try {
            server = new ServerSocket(8001);
            System.out.println("监听建立 等你上线\n");
            server.setSoTimeout(60000);
            Socket socket = server.accept();
            System.out.println(format.format(new Date()));
            System.out.println("建立了链接\n");
 
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 
            socket.setSoTimeout(timeout * 1000);
            System.out.println(format.format(new Date()) + "\n" + timeout + "秒的时间 快写\n");
 
            System.out.println(format.format(new Date()) + "\nClient:" + br.readLine() + "\n");
 
            Writer writer = new OutputStreamWriter(socket.getOutputStream());
             
            System.out.println(format.format(new Date()));
            System.out.println("我在写回复\n");
             
            writer.write("收到\n");
 
            Thread.sleep(1000);
            writer.flush();
             
            System.out.println(format.format(new Date()));
            System.out.println("写完啦 你收下\n\n\n\n\n");
        } catch (SocketTimeoutException e) {
            System.out.println(format.format(new Date()) + "\n" + timeout + "秒没给我数据 我下啦\n\n\n\n\n");
            e.printStackTrace();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

客户端代码实现

package test.socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class SocketClient {
    public static String timeStyle = "yyyy-MM-dd HH:mm:ss SSS";
    public static SimpleDateFormat format = new SimpleDateFormat(timeStyle);
    // 设置超时间
    public static int timeout = 5;
 
    public static void main(String[] args) {
        System.out.println("----------Client----------");
 
        Socket socket = null;
        try {
            // 与服务端建立连接
            socket = new Socket("127.0.0.1", 8001);
            socket.setSoTimeout(timeout * 1000);
 
            System.out.println(format.format(new Date()));
            System.out.println("建立了链接\n");
 
            // 往服务写数据
            Writer writer = new OutputStreamWriter(socket.getOutputStream());
                         
            System.out.println(format.format(new Date()));
            System.out.println("我在写啦\n");
           
            writer.write("有没有收到\n");
             
            System.out.println(format.format(new Date()));
            System.out.println("写完啦 你收下\n");
             
            writer.flush();
             
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 
             
            System.out.println(format.format(new Date()) + "\n" + timeout + "秒的时间 告诉我你收到了吗\n");
            Thread.sleep(timeout);
            System.out.println(format.format(new Date()) + "\nServer:" + br.readLine());
             
        } catch (SocketTimeoutException e) {
            System.out.println(format.format(new Date()) + "\n" + timeout + "秒没收到回复 我下啦\n\n\n\n\n");
            e.printStackTrace();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

你可能感兴趣的:(通信协议)