Java使用Socket的通信过程

1.服务器端socket绑定端口,并一直监听该端口,等待客户端的连接

2.客户端绑定一个端口,并通过套接字连接服务器端等待服务的端口

3.连接成功后,服务器端和客户端通过建立的连接进行通信

4.一端关闭连接,另一端捕捉异常通信结束。

使用Java代码实现上述的通信过程:

客户端代码:

packagechat2;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.InetAddress;importjava.net.Socket;importjava.util.Scanner;public classClientSocket {public static void main(String[] args) throwsException {try{

System.out.println("聊天开始");while (true) {

Socket client_socket= new Socket(InetAddress.getLocalHost(), 4856);

OutputStream os=client_socket.getOutputStream();

Scanner sc= newScanner(System.in);

String str=sc.nextLine();char flag = str.charAt(0);

os.write(str.getBytes());

client_socket.shutdownOutput();

InputStream is=client_socket.getInputStream();byte[] data = new byte[1024];int len = 0;while ((len = is.read(data)) != -1) {

System.out.println("服务器说"+new String(data, 0, len));

}

printStack();

is.close();

os.close();

client_socket.close();

Thread.sleep(200);

}

}catch(Exception e) {

System.out.println("聊天结束");

System.exit(0);

}

}public static voidprintStack() {

StackTraceElement[] element=Thread.currentThread().getStackTrace();for (int i = 0 ;i < element.length; i++){

System.out.println(element[i].getClassName()+" 。"+element[i].getMethodName()+"-----");

}

}

}

服务器端代码:

packagechat2;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.Scanner;public classServer {public static void main(String[] args) throwsException {try{

System.out.println("开始聊天");

ServerSocket serverSocket= new ServerSocket(4856);

ClientSocket.printStack();while (true) {

Socket accept=serverSocket.accept();

InputStream is=accept.getInputStream();byte[] data = new byte[1024];int len = 0;while ((len = is.read(data)) != -1) {

System.out.println("客户端说"+new String(data, 0, len));

}

Scanner sc= newScanner(System.in);

String str=sc.nextLine();char flag = str.charAt(0);

OutputStream os=accept.getOutputStream();

os.write(str.getBytes());

ClientSocket.printStack();

accept.shutdownOutput();

is.close();

os.close();

accept.close();

}

}catch(Exception e) {

System.out.println("聊天结束");

System.exit(0);

}

}

}

常用的操作系统的Socket通信API

1.bind

intbind(

__in SOCKET s, //.指定一个未绑定的socket。

__inconst struct sockaddr*name,//指向sockaddr地址的指针,该结构含有IP和PORT

__inintnamelen //Length of the value in the name parameter, in bytes。

);

2.listen

intlisten(

__in SOCKET s, //socket描述符,该socket是一个未连接状态的socket

__inintbacklog //挂起连接的最大长度,如果该值设置为SOMAXCONN,负责socket的底部服务提供商将设置该值为最大合理值。并没有该值的明确规定。

);

3.accpet

SOCKET accept(

__in SOCKET s, //listen函数用到的socket。accept函数将创建连接。

__outstruct sockaddr*addr, //指向通信层连接实体地址的指针。

__in_outint*addrlen //addr的长度。

);

4.connect

intconnect(

__in SOCKET s,

__inconst struct sockaddr*name,//指明待连接的地址

__inintnamelen

);

Java的Socket通信与底层C语言的Socket通信的关系:

分析服务器端的

ServerSocket serverSocket = new ServerSocket(4856);

所对应的C语言Socket源码,java中该语句的作用是创建一个socket并为其绑定对应的端口。

查看JDK中源码,对该方法进行追溯,可得到其最终调用了两个本地方法:

static native void bind0(int fd, InetAddress localAddress, intlocalport,booleanexclBind)throws IOException;

static native void listen0(int fd, int backlog) throws IOException;

而服务器端的代码

Socket accept = serverSocket.accept();

的作用是阻塞自己并接收请求。查看JDK中源码,对该方法进行追溯,其调用本地方法:

static native int accept0(int fd, InetSocketAddress[] isaa) throws IOException;

对客户端代码

Socket client_socket = new Socket(InetAddress.getLocalHost(), 4856);

,其中用是与对应的socket连接并进行通信,对其进行源码分析可追溯到:

即调用的:

static native int connect0(int fd, InetAddress remote, intremotePort)throws IOException;

JavaNative方法与操作系统的Socket方法关系分析:

以上JavaSocket所调用的native方法即为对应的C方法。native方法再虚拟机上执行,即调用操作系统的Socket通信方法。

即整个流程就是Java方法调用C语言写的Native方法,native方法再虚拟机执行调用操作系统的socket方法。即java的native方法与winsock.dll中的操作系统socket方法是一一对应的。

api有哪些 javasocket_Java的socket通信与操作系统的SocketAPI关系探究相关推荐

  1. Socket通信之操作系统的字节序和位数

    关于Socket通信过程中字节序 在网络编程里,网络字节序是big-endian的,而大部分的PC的系统都是X86处理器系列,X86采用的是little-endian,所以需要将网络数据流转换成本地数 ...

  2. api有哪些 javasocket_Java原生Socket API

    类列表 类名 描述 java.net.Socket 客户端套接字 java.net.ServerSocket 服务器套接字 java.net.InetAddress 用来表示IP地址的高级表示 jav ...

  3. api有哪些 javasocket_Java Socket编程以及与Linux Socket API关系

    Socket 编程(基于Linux) Socket独立于具体协议的网络编程接口,在ISO模型中,主要位于会话层和传输层之间:在通用的计算机网络五层模型中,主要位于应用层和传输层之间. Linux So ...

  4. 手把手教你 Socket 通信(TCP/IP)

    本文将给出完整 Socket 通信代码,在 eclipse 中亲测有效.在Android Studio中用Java开发也是一样的,只是把代码和控件搭配一下,注册监听就好. 网络上的两个程序通过一个双向 ...

  5. php 实例说明 socket通信机制

    php 实例说明 socket通信机制 张映 发表于 2010-04-24 分类目录: php 一,socket是什么 什么是socket 所谓socket通常也称作"套接字",用 ...

  6. 【学习笔记】在windows下进行基于TCP的本地客户端和服务端socket通信

    文章目录 socket介绍 java中使用socket 基于tcp的socket通信 使用ServerSocket类创建一个web服务器:(java) windows下的基于tcp的socket编程( ...

  7. java与c 通信_Java与C之间的socket通信

    最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少 ...

  8. Java 网络通信必备之socket通信基本原理介绍

    Java socket通信基本原理介绍 Java socket通信在不断的进行相关代码的开发,下面我们就看看如何才能更好的使用有关技术为我们的编程工作带来一定的帮助. 作者:佚名来源:互联网|2010 ...

  9. C#中Socket通信编程的同步实现

    目录(?)[+] Socket编程基础 什么是Socket编程的同步实现 如何实现Socket同步通信 服务端 基本流程 代码示例 客户端 基本流程 代码示例 总结 本文通过分析和总结C#中Socke ...

最新文章

  1. 财务思维01-财务报表
  2. iOS之深入解析CocoaPods的插件机制和如何加载插件整合开发工具
  3. 【编译原理】词法分析程序设计
  4. highCharts使用中问题总结
  5. 谐波分析显著性检验matlab,关于谐波检测方法的MATLAB仿真及综合性能分析.pdf
  6. php 与 memcache 笔记
  7. MFC中开发ocx控件,html容器收不到ocx的事件Event
  8. 维护UI状态的最懒惰方法
  9. mysql使用文件排序_Mysql排序FileSort的问题
  10. TopCoder中插件的用法
  11. python lambda菜鸟教程_Python - lambda函数
  12. 认清微信支付v2和v3
  13. 初识Tracepro及基本操作说明
  14. Android DataStore
  15. TensorRT——安装报错解决:sudo pip3 install tensorrt-8.4.0.6-cp38-none-linux_x86_64.whl
  16. matlab距离平方和公式推导,lstopt 非线性拟合:相关系数之平方(R^2)和决定系数(DC)计算公式是?...
  17. 1到100的偶数之和是多少_求1到100之间所有偶数之和
  18. 对 Error-State Kalman Filter 的理解
  19. 做形态学方法的团队_2020年第十六届国际土壤微形态学会议(ICOSM)
  20. 一个bug管理软件:BugFree

热门文章

  1. ios禁止背景弹性滑动
  2. 哈工大18年春软件构造课程讨论题
  3. vue项目,报错This is probably not a problem with npm,there is likely additional logging output above
  4. GOPATH 与工作空间
  5. BlackHat2020议题之Web缓存投毒
  6. Python爬取394452条《都挺好》弹幕数据,发现弹幕比剧还精彩?
  7. hdu 4210 Su-domino-ku
  8. 全国人工智能师资培训班·上海站火热招生中
  9. 防火墙(360天堤)双因素身份认证解决方案
  10. NoC-based DNN Accelerator: A Future Design Paradigm