1.Socket是什么?

socket是进程之间通信的一种方式,调用这个网络库中的一些API实现分布在不同主机之间的相关进程的一些数据交换。

服务器端需要做的事情

  1. 打开一个通信通道并告诉本机,它愿意在某一公认地址上的某端口接收客户请求。
  2. 等待连接到达该端口
  3. 接收客户端的服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一新的进程来处理这个客户请求。
  4. 返回第2步,等待另一客户请求
  5. 关闭服务器

客户端要做的事

  1. 打开一通信通道,并连接到服务器所在主机的特定端口
  2. 向服务器发送服务请求报文,等待并接收应答,继续发送请求
  3. 请求结束后关闭通信通道并终止

服务器一般先启动。

2.简单的一个栗子

服务器端:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;/*** @author ChenYuXi* @version 1.0* @since 2019/8/12 on 10:59**/
public class TcpServer {public static void main(String[] args) throws Exception {try {//建立套接字ServerSocket server = new ServerSocket(4800);//监听//accept()方法接收到客户端的请求//使用accept方法返回的Socket与客户端进行通信Socket socket = server.accept();System.out.println("server socket Hashcode:" + socket.hashCode());//建立连接InputStreamReader sysIn = new InputStreamReader(System.in);BufferedReader sysBuf = new BufferedReader(sysIn);InputStreamReader socIn = new InputStreamReader(socket.getInputStream());BufferedReader socBuf = new BufferedReader(socIn);PrintWriter socOut = new PrintWriter(socket.getOutputStream());//读取从客户端发过来的System.out.println("Client:" + socBuf.readLine());String readLine = sysBuf.readLine();while (!readLine.equals("bye")){socOut.println(readLine);socOut.flush();System.out.println("Server:"+readLine);String rl = socBuf.readLine();if(!rl.equals("ok")){System.out.println("Client:"+rl);}else{break;}readLine = sysBuf.readLine();}//关闭IO、SocketsocOut.close();socIn.close();server.close();}catch (Exception e){System.out.println("Error:" + e);}}
}

客户端:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;/*** @author ChenYuXi* @version 1.0* @since 2019/8/12 on 10:59**/
public class TcpClient {public static void main(String[] args) throws Exception{try{//创建SocketSocket socket = new Socket("127.0.0.1",4800);System.out.println("client socket Hashcode:" + socket.hashCode());//建立连接,从系统读取字节流到sysIn当中InputStreamReader sysIn = new InputStreamReader(System.in);//将读入的字节流放入缓冲中BufferedReader sysBuf = new BufferedReader(sysIn);//从socket中读取字节流到socIn当中InputStreamReader socIn = new InputStreamReader(socket.getInputStream());//将读入的字节流放入缓冲当中BufferedReader socBuf = new BufferedReader(socIn);//获取socket中的输出流,并使用一个socOut进行操作//socket.getOutputStream:获取socket中的字节流//getOutputStream 返回一个OutputStream 是字节流//PrintWriter:将字节流转化成字符流输出PrintWriter socOut = new PrintWriter(socket.getOutputStream());//进行通信,读入键盘输入的数据String readline = sysBuf.readLine();//输入bye时停止通信while (!readline.equals("bye")){//println这个方法的意思好像是把参数写入到socket的输出流当中去socOut.println(readline);socOut.flush();System.out.println("Client:"+readline);System.out.println("Server:"+socBuf.readLine());readline = sysBuf.readLine();}//关闭io和关闭socketsocOut.close();socIn.close();socket.close();}catch (Exception e){System.out.println("Error:" + e);}}
}

最开始的时候觉得服务端第二行代码:

Socket socket = server.accept();

得到的这个socket应该是client端的socket。
因为在client端中:

 PrintWriter socOut = new PrintWriter(socket.getOutputStream());String readline = sysBuf.readLine();....socOut.println(readline);

将系统的输入,也就是键盘输入的值放入readline中,再通过PrintWriter.println(readline)写入到socket的输出流中,但为什么server可以接收到这个socket的输出流中的值呢?看看服务端的代码:

InputStreamReader socIn = new InputStreamReader(socket.getInputStream());
BufferedReader socBuf = new BufferedReader(socIn);
...
System.out.println("Client:" + socBuf.readLine());

直接将socket的输入流中的内容打印出来,并加上Client表示这是客户端的消息
我就尝试打印了一下客户端的socket和服务端通过server.accept()返回的socket的hashcode。
代码如下
客户端

//创建Socket
Socket socket = new Socket("127.0.0.1",4800);
System.out.println("client socket Hashcode:" + socket.hashCode());

服务端

//建立套接字
ServerSocket server = new ServerSocket(4800);//监听
//accept()方法接收到客户端的请求
//使用accept方法返回的Socket与客户端进行通信
Socket socket = server.accept();
System.out.println("server socket Hashcode:" + socket.hashCode());

结果:首先启动TcpServer:
没有打印出hashcode:

再启动TcpClient,此时结果如下:发现TcpServer通过accept方法接收到的socket和TcpClient中创建的socket的hashcode真的是相同的这样是不是就是证明了他们是同一个socket,所以就可以通过对同一个socket的读和写来进行客户端和服务端的数据的传递?但是又有很多地方说这里是创建的一个socket,我查看accpet的源码时好像也是新创建的一个socket。
更新:实际上这里就是不一样的socket,只是在我电脑上巧合会出现两个socket的hashcode是相同的。同学在他电脑上试过发现是不一样的socket


最后看一下client和server通信的效果:
client发送数据1,首先在本地打印,再查看server发现server收到了来自于client的数据1


server进行回应,回应时先在本地打印发送的数据2,查看client,发现接收到了来自server的数据2


client发送ok通知server不必再等待,client发送bye停止发送数据,这个就不截图了,大家可以直接用代码试。
参考资料:https://www.zhihu.com/question/29637351

Java的Socket网络编程相关推荐

  1. Java之socket网络编程

    socket网络编程 文章目录 socket网络编程 一.网络编程概述 二.网络通信要素概述 三.IP和端口号 四.网络协议 五.TCP网络编程 六.UDP网络编程 一.网络编程概述 网络编程的目的 ...

  2. 【Java】Socket网络编程解读与实战

    Socket原理 Socket原理 <Socket 到底是什么> Socket--套接字 是网络应用程序编程的接口和一种机制 用套接字中的相关函数来建立连接和完成通信 Socket可以看成 ...

  3. (Java)socket网络编程及处理socket粘包拆包问题

    目录 1.socket简介 2.TCP/IP协议 3.tcp三次握手 4.socket的一些接口函数原理 5.java socket 长连接粘包拆包问题 6.socket模拟服务端客户端发消息 7.U ...

  4. JAVA.SE Socket网络编程

    文章目录 1.网络编程入门 1.1软件架构介绍 1.2互联网通信协议 1.3网络编程的三要素 2.TCP通信 2.1通信分为客户端与服务器 2.2 socket的介绍与使用 2.3servletSoc ...

  5. java使用socket网络编程实现qq互聊(UPD简单版本)

    JAVA初学者.勿喷. eclipse稍微有点难用,关程序是在Console里面,要是没开出来并且死循环的话电脑cpu直接拉满了. 而且进程的关闭是输入指定的"再见"才关闭多线程, ...

  6. 【Java】Socket网络编程实现内网穿透、端口映射转发、内网穿透上网工具的编写,设置IP白名单防火墙

    这里写目录标题 简介 更新 一.背景 1.1 情景假设 1.2 想要达到的目的 1.3 局限 1.3 解决方案一(路由器NAT) 1.4 解决方案二(云服务器转发) 二.方案介绍 2.1 方案简介 2 ...

  7. Java 之 socket 网络编程

    客户端 import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.n ...

  8. Linux C++/Java/Web/OC Socket网络编程

    一,Linux C++ Socket网络编程 1.什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制 ...

  9. linux java socket编程_深入学习socket网络编程,以java语言为例

    了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...

最新文章

  1. Tomcat maven 插件启动出现tomcat\conf\tomcat-users.xml cannot be read异常解决方法
  2. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第20篇]Merkle-Damgaard hash函数如何构造
  3. C++11学习 virtual(虚函数)的用法
  4. 携程微服务框架实践及思考
  5. fastjson 判断value是对象还是数组
  6. 三元一次方程组步骤_姜红梅名师工作室【教学感悟】三元一次方程组解法的思考...
  7. 【1291】数据结构上机测试4.1:二叉树的遍历与应用1 SDUTOJ
  8. Java中的HashCode 1 之hash算法基本原理
  9. java 同余法产生随机数_线性同余法生成为随机数
  10. vscode快速格式化代码
  11. python算大写字母
  12. 【详细】endnote中英文文献混排
  13. Method-Swizzling 方法交换
  14. Windows安装ElasticSearch 7.3.0
  15. python3实现cv2+numpy裁剪不规则四边形图片
  16. 云上城之歌通用服务器是什么意思,云上城之歌ios安卓是互通的吗 不同系统可以一起玩吗...
  17. 腾讯万亿级 Elasticsearch
  18. Power BI数据建模
  19. PHP防止vip视频被下载
  20. 非诚勿扰24灯全灭php,收二手货小伙上非诚勿扰,24盏灯全灭还遭羞辱,最后才知道是收二手豪车身价上亿...

热门文章

  1. getTime()获取时间戳方法与时区有关
  2. HTML、HTTP、Web综合面试题(三)
  3. 【mysql】 踩坑记录之derived(派生表)
  4. python输出中文加数字_Python实现阿拉伯数字加上中文数字
  5. Javalin:一个轻量的 Web Framework
  6. Boring Old Menu Bar for Mac(菜单栏美化工具)
  7. 如何在Node.js中获取本机本地IP地址
  8. 二叉树的遍历(非递归)整理
  9. 算法 + 算法 = 新算法
  10. RA-GCN:Richly Activated Graph Convolutional Network for Robust Skeleton-based Action Recognition