什么是socket

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

TCP/IP UDP是什么?

TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。

下面是他们三者的关系:

可以看出TCP/IP协议族包括运输层、网络层、链路层。socket是一个接口,在用户进程与TCP/IP协议之间充当中间人,完成TCP/IP协议的书写,用户只需理解接口即可。

所以socket到底是什么?

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

socket工作原理

要通过互联网进行通信,至少需要一对套接字,一个运行于客户机端,称之为ClientSocket,另一个运行于服务器端,称之为serverSocket

socket工作原理

socket服务器和客户端源码

服务器代码:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.ServerSocket;

import java.net.Socket;

public class Server {

public static void main(String[] args) throws IOException {

ServerSocket serverSocket = new ServerSocket(2000);

System.out.println("服务器准备就绪");

//System.out.println("client: "+ socket.getLocalAddress() + " p : " + socket.getLocalPort());

System.out.println("服务器信息 : " + serverSocket.getInetAddress() + " p : " + serverSocket.getLocalPort());

//等待客户端连接

while (true) {

Socket client = serverSocket.accept();

ClientHandler clientHandler = new ClientHandler(client);

clientHandler.start();

}

}

private static class ClientHandler extends Thread{

private Socket socket;

ClientHandler(Socket socket){

this.socket = socket;

}

private boolean flag = true;

@Override

public void run() {

//super.run();

System.out.println("新客户端连接: " + socket.getInetAddress() + "p: " + socket.getPort());

try {

//得到打印流,用于数据输出;服务器回送数据使用

PrintStream soketOutput = new PrintStream(socket.getOutputStream());

//得到输入流,用于接收数据

BufferedReader socketInput = new BufferedReader(

new InputStreamReader(socket.getInputStream()));

do {

//客户端拿到一条数据

String str = socketInput.readLine();

//String echo = socketInput.readLine();

if ("bye".equalsIgnoreCase(str)) {

flag = false;

soketOutput.println("bye");

}else {

//打印到屏幕,并回送数据长度

System.out.println(str);

soketOutput.println("回送: " + str.length());

}

}while (flag);

socketInput.close();

soketOutput.close();

} catch (IOException e) {

System.out.println("连接异常断开");

}finally {

//连接关闭

try {

socket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

System.out.println("客户端已退出: " + socket.getInetAddress() + " p : " + socket.getPort());

}

}

}

客户端代码:

import java.io.*;

import java.net.Inet4Address;

import java.net.InetSocketAddress;

import java.net.Socket;

public class Client {

public static void main(String[] args) throws IOException {

Socket socket = new Socket();

socket.setSoTimeout(3000);

//连接本地,端口2000;超时时间为3000ms

socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(),2000), 3000);

System.out.println("服务器已连接");

System.out.println("client: "+ socket.getLocalAddress() + " p : " + socket.getLocalPort());

System.out.println("服务器信息 : " + socket.getInetAddress() + " p : " + socket.getPort());

try {

todo(socket);

}catch (Exception e){

System.out.println("关闭异常");

}

socket.close();

System.out.println("客户端已退出");

}

private static void todo(Socket client) throws IOException{

InputStream in = System.in;

BufferedReader input = new BufferedReader(new InputStreamReader(in));

//得到soket输出流,并转换为打印流

OutputStream outputStream = client.getOutputStream();

PrintStream sockePrintStream = new PrintStream(outputStream);

// 得到sokcet输入流,并转换为socketBufferReader

InputStream inputStream = client.getInputStream();

BufferedReader sokcetBufferedReader = new BufferedReader(new InputStreamReader(inputStream));

boolean flag = true;

do {

//键盘读取一行

String str = input.readLine();

//发送到服务器

sockePrintStream.println(str);

//从服务器读取一行

String echo = sokcetBufferedReader.readLine();

if ("bye".equalsIgnoreCase(echo)) {

flag = false;

}else {

System.out.println(echo);

}

}while (flag);

//关闭socket流

sockePrintStream.close();

sokcetBufferedReader.close();

}

}

执行效果:

socket总结

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认

服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客 户端,一旦客户端确认了此描述,连接就建立好了。

而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

android socket io和服务器_Java socket通讯服务器和客户端教学版相关推荐

  1. java socket 编程 客户机服务器_Java Socket编程服务器响应客户端实例代码

    通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: import java.io.BufferedReader; import java.io.IOException; imp ...

  2. 一段最简单的使用socket.io进行服务器和客户端通信的例子代码

    服务器端代码: var app = require('express')(); var server = require('http').Server(app); var io = require(' ...

  3. java socket编程聊天室_Java Socket通信之聊天室功能

    Java Socket通信之聊天室功能 发布时间:2020-10-17 14:36:00 来源:脚本之家 阅读:73 作者:LY_624 本文实例为大家分享了Java Socket聊天室功能的具体代码 ...

  4. java socket 重连复用_Java Socket编程基础及深入讲解(示例代码)

    Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基 ...

  5. java贪吃蛇客户端服务器_java Socket套接字TCP编程开发服务端和客户端之间的通信 - 贪吃蛇学院-专业IT技术平台...

    超级简单,没有太多实质内容的Socket服务端,客户端小程序 先运行server 再运行client OK 服务端代码如下: public class Server { public static v ...

  6. java socket 判断断网_java socket 判断对方在线或离线、断线

    1 在客户端和服务器端做心跳检测(这个后来我放弃了) 2 客户端中断连接,服务器会抛出异常,利用这点 3这是我为什么不用心跳包的原因,因为不需要了. 有的时候,我们可能网络突然中断了. 但是服务器依然 ...

  7. android小程序 socket,能在微信小程序中使用的socket.io客户端

    微信小程序版 socket.io和engine.io 可以使用在微信小程序中的socket.io和engine.io 微信小程序的websocket做了一次封装,导致socket.io或者engine ...

  8. Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架

    一.基本介绍 WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯.而Socket.IO是一个完全由JavaScript实现.基于Node.js.支持WebSocket ...

  9. 突袭HTML5之WebSocket入门3 - 通信模型socket.io

    为什么需要socket.io? node.js提供了高效的服务端运行环境,但是由于浏览器端对HTML5的支持不一,为了兼容所有浏览器,提供卓越的实时的用户体验,并且为程序员提供客户端与服务端一致的编程 ...

最新文章

  1. Tensorflow 错误总结:ImportError: cannot import name add_newdocs.
  2. liblapack.so.3: undefined symbol: gotoblas错误及解决办法
  3. 第四章 Rails 背后的 Ruby
  4. linux文件属性和类型
  5. Redhat Linux编译安装LAMP环境
  6. “企业知识产权管理与预警”培训活动在省技术产权交易市场成功举办
  7. Hive分析函数--row_number 的用法
  8. Manjaro-KDE自定义应用列表
  9. EMNLP'21 | 学习改写非自回归机器翻译的翻译结果
  10. 新兴IT企业特斯拉(三)——Model S
  11. MCMC算法大统一: Involutive MCMC
  12. 华为篇-嵌入式公司待遇盘点-第二期
  13. Android后台播放音乐(含通知栏操作)
  14. oracle使用with递归查询
  15. 两亚太国家宣布其央行不会发行数字货币
  16. 根据身份证获取出生日期
  17. lt;江山美人gt;为何淡季赢得高票房
  18. 敏捷软工结对编程博客
  19. 小知识:Access端口和Trunk端口
  20. 深入解析python版SVM源码系列(三)——计算样本的预测类别

热门文章

  1. IOS小技巧–用runtime 解决UIButton 重复点击问题
  2. c#中windows验证连接字符串
  3. 15年资深产品经理判官:怎样搭建完整的产品矩阵
  4. 为什么你今年的去哪儿产品经理面试挂了?
  5. 专家周 | 电商牛人的新玩法,寺库如何做奢侈品电商?视频社交电商如何运作的?...
  6. 市值十亿美金公司的五个特点
  7. jenkins+git+maven搭建项目自动化持续集成
  8. 委托学习总结(一)浅谈对C#委托理解
  9. 你想使用自己编译的内核进行工作吗?
  10. vue14 自定义过滤器