Socket之tcp

作用:完成两个应用程序之间的数据传输

含义:套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元,由IP地址和端口结合的,提供向应用层进程传送数据包的机制。

工作流程:要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,我们称之为 Client Socket,另一个运行于服务器端,我们称之为 Server Socket

1.服务器端监听 2.客户端发起请求 3.服务器端收到请求,响应给客户端确认,建立连接

Socket是什么?它在哪里?

根据五层网络模型,

 

                   物理层

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,对开发人员来说,我们不需要彻底搞懂tcp/ip协议具体怎么工作,合理使用socket接口

就已经符合指定的协议

一个小例子先看看具体怎么写:

客户端

package com.company;

import java.io.IOException;
import java.net.Socket;
import java.util.logging.Logger;

public class Main {

    public static void main(String[] args) throws IOException {
    // write your code here
        Logger log= Logger.getGlobal();
        log.info("客户端启动");

        Socket socket=new Socket("localhost",53);//初始化客户端socket,定服务绑器ip,端口号
    }
}

服务端:

package com.company;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Logger;

public class Main {

    public static void main(String[] args) throws IOException {
        Logger log=Logger.getGlobal();
        log.info("server run");


        ServerSocket serverSocket=new ServerSocket(53);//初始化服务端socket,绑定端口
        log.info("准备进行监听,随时接受客户端连接");
        Socket socket=serverSocket.accept();//调用accept阻塞监听端口,等待客户端连接,接受到后才继续执行下面
        log.info("这句执行,说明阻塞状态结束,已经获取请求");
        if(socket!=null){
            log.info("确实收到请求了");
        }
    }
}

 范例二,上面是联通了,然后在联通基础上进行收发数据

package com.company;

import java.io.*;
import java.net.Socket;
import java.util.logging.Logger;

public class Main {

    public static void main(String[] args) throws IOException {
    // write your code here
        Logger log= Logger.getGlobal();
        log.info("客户端启动");

        //建立到服务端的连接
        Socket socket=new Socket("localhost",53);//初始化客户端socket,绑定服务绑器ip,端口号

        //发送数据
        OutputStream out=socket.getOutputStream();
        //包装为高级输出流
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(out));
        bw.write("0101,我是08,收到请回答!
你好
");
        bw.flush();
        log.info("发送数据完毕");

        //包装为高级输入流,接收数据
        InputStream in=socket.getInputStream();
        BufferedReader br=new BufferedReader(new InputStreamReader(in));
        String mess=br.readLine();
        log.info(mess);




    }
}
package com.company;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Logger;

public class Main {

    public static void main(String[] args) throws IOException {
        //打日志
        Logger log=Logger.getGlobal();
        log.info("server run");

        ServerSocket serverSocket=new ServerSocket(53);
        log.info("初始化服务,等待客户端请求");
        Socket socket=serverSocket.accept();//阻塞监听,等待接受客户端请求
        log.info("客户端:"+serverSocket.getInetAddress().getLocalHost()+"已连接到服务器");
        //获取输入流对象,转换为InputStreamReader,再包装为BufferedReader,接收数据
        BufferedReader bf= new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String mess=bf.readLine();//一次读一行,
标识一行
        log.info(mess);

        //返回数据到服务器
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write("0808,01已收到,请说事,over!
");
        bw.flush();
        


    }
}
原文地址:https://www.cnblogs.com/hebiao/p/14392090.html