大家好,欢迎来到IT知识分享网。
目录
一、socket简介
1.在本地进程间通信,可以用pid标识一个进程。但在网络上,pid可能会存在冲突,所以使用ip地址+协议+端口号唯一标识网络中的一个进程。
2.socket起源unix,而unix是遵从一切皆文件的哲学,socket是基于一种从打开到读和写,再到关闭的模式去实现的。
3.socket与TCP/IP协议没有必然的联系,只是使得程序员更方便的使用TCP/IP协议栈,对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。
二、Socket通信流程
步骤:
1.服务端socket() : 服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket.
2.服务端bind():服务器为socket绑定ip地址和端口号
3.服务端listen():服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开
4.客户端socket():客户端创建socket
客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket。
客户端连接成功,向服务器发送连接状态信息
5.服务端accept():服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端连接请求.
服务器accept方法返回,连接成功
6.客户端send():客户端向socket写入信息
7.服务端recv():服务器读取信息
8.客户端close():客户端关闭socket
9.服务端close():服务器端关闭socket
三、Socket网络通信例子
一个网络应用程序,客户端向服务器发送一个字符串,服务器收到该字符串后将其打印到命令行上,然后向客户端返回该字符串的长度,最后,客户端输出服务器端返回的该字符串的长度,使用 TCP 方式去实现。
少了一个人UDPServer
1.服务端代码
public class TCPServer { public static void main(String[] args) throws Exception{ //创建socket,并将socket绑定到65000端口 ServerSocket ss = new ServerSocket(65000); //死循环,使得socket一直等待并处理客户端发送过来的请求 while(true){ //监听65000端口,直到客户端返回连接信息后才返回 Socket socket = ss.accept(); //获取客户端的请求信息后,启动一个新线程执行相关业务逻辑 new LengthCalculator(socket).start(); } } }
2.服务端业务处理线程代码
public class LengthCalculator extends Thread{ //socket为成员变量,来接收服务端socket实例 private Socket socket; public LengthCalculator(Socket socket){ this.socket = socket; } // run()保存了所有的业务逻辑 public void run(){ try { //获取socket的输出流 OutputStream os = socket.getOutputStream(); //获取socket的输入流 InputStream is = socket.getInputStream(); int ch = 0; //buff用来读取输入的内容,存成byte数组,ch用来获取读取数组的字节数 byte[] buff = new byte[1024]; ch = is.read(buff); //将接收流的byte数组转换成字符串,这里获取的内容是客户端发送过来的字节数组 String content = new String(buff,0,ch); System.out.println(content); //往输出流里写入获得的字符串的长度,回发给客户端 os.write(String.valueOf(content.length()).getBytes()); //一定要关闭输入输出流以及socket is.close(); os.close(); socket.close(); } catch (IOException e) { throw new RuntimeException(e); } } }
3.客户端代码
public class TCPClient { public static void main(String[] args) throws Exception{ //创建socket,并指定连接的是本机的端口号为65000的服务器socket Socket socket = new Socket("127.0.0.1",65000); //获取输出流 OutputStream os = socket.getOutputStream(); //获取输入流 InputStream is = socket.getInputStream(); // 将要传递给server的字符串参数转换称byte数组,并将数组写入到输出流中 os.write(new String("hello world").getBytes()); int ch = 0; byte[] buff = new byte[1024]; // buff主要用来读取输入的内容,存成byte数组,ch主要用来获取读取数组的长度(与服务端作用相同) ch = is.read(buff); //将接收流的byte数组转换成字符串,这里是从服务端回发的字符串参数的长度 String content = new String(buff,0,ch); System.out.println(content); //一定要关闭输入输出流及socket is.close(); os.close(); socket.close(); } }
4.运行结果
服务端:
客户端:
5.流程总结
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120918.html



