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,收到请回答!\n你好\n"); 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();//一次读一行,\n标识一行 log.info(mess); //返回数据到服务器 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); bw.write("0808,01已收到,请说事,over!\n"); bw.flush(); } }