socket的应用案例

爱分享社区 爱分享社区     2022-08-23     187

关键词:

java提供网络功能的四大类
1、InetAddress :用于标识网络上的硬件资源。
2、URL:统一资源定位符,通过URL可以直接读取和写入网络上的数据。
3、Socket:使用TCP协议实现网络通信的Socket相关类
4、Datagram:使用UDP协议,将数据保存到数据报中,通过网络进行通讯。

InetAddress的使用
public static void main(String[] args) throws Exception {
//获取本机的InetAddress实例
InetAddress address = InetAddress.getLocalHost();
//根据机器名字获取InetAddress的实例
address=InetAddress.getByName("计算机名字");

address.getHostName();//计算机名字
address.getHostAddress();//IP地址
address.getAddress();//字节数组形式的IP地址
}

URL的使用
public static void main(String[] args) throws Exception {
//创建一个url实例
URL url = new URL("https://www.baidu.com");
//创建子URL实例
URL url2 = new URL(url, "/login.html?pw=北风");

url.getProtocol();//协议
url.getHost();//主机
url.getPort();//端口号
url.getPath();//文件路径
url.getFile();//文件名
url.getRef();//相对路径
url.getQuery();//查询条件
}
URL的读取数据资源
public static void main(String[] args) throws Exception {
URL url =new URL("www.baidu.com");
//通过openStream()方法获取URL对象所表示资源的字节输入流。
InputStream is = url.openStream();
//将字节流转换成字符流
InputStreamReader isr = new InputStreamReader(is);
//为字符流添加缓冲
BufferedReader br = new BufferedReader(isr);

//读取数据
String info = null;
if((info = br.readLine())!=null){
System.out.println("读取的数据为:"+ info);
}
//关闭资源
br.close();
isr.close();
is.close();
}

基于TCP协议实现网络通信
客户端Socket类
服务器端 ServerSocket 类

步骤:1.建立服务器端倾听;2.客户端创建socket向服务器端发送请求;3.服务器端等待并接受连接请求,然后创建socket连接;4.服务器端与客户端通过IO流进行通讯;5.关闭两端的socket通信。

服务器端:create --bind --listen--accept--recv/send--close
1.创建ServerSocket对象,绑定监听端口;
2.通过accept()方法监听客户端请求;
3.建立连接后,通过输入流读取客户端发送的请求信息;
4.通过输出流向客户端发送响应信息;
5.关闭资源。
客户端:create------- conncet------send/recv------close.
1.创建Socket对象,绑定服务器地址和端口号;
2.建立连接后通过输出流向服务器端发送请求信息;
3.通过输入流获取服务器端响应的信息;
4.关闭相关管资源。

TCP代码展示
客户端的 TCPServer.java
public static void main(String[] args) {
//1.创建服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口。
ServerSocket serverSocket = new ServerSocket(8888);

//2.调用accept()方法开始监听,等待客户端的连接
System.out.println("***服务器即将启动,等待客户端的连接****");
Socket socket = serverSocket.accept();//使之处于阻塞状态,等待客户端连接

//3.获取输入流,并获取客户端的登录信息。
InputStream is = socket.getInputStream();//字节输入流(用户登录信息)

//读取对象
ObjectInputStream ois = new ObjectInputStream(is);
User vo = (User)ois.readObject();
System.out.println(vo);

//读取字符串
//InputStreamReader isr = new InputStreamReader(is);//字符流转换成字节流,提高效率。
//BufferedReader br = new BufferedReader(isr);//为输入流添加缓冲
//String info=null;
//while ((info = br.readLine())!=null) {
// System.out.println("我是服务器,客户端说:"+info);
//}

socket.shutdownInput();//关闭输入流

//4.获取输出流,相应客户端请求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);//包装为打印流
pw.write("您好!");
pw.flush();//将缓冲输出

//5.关闭资源
pw.close();
os.close();
//br.close();
//isr.close();
is.close();
socket.close();
serverSocket.close();
}

服务器端 TCPClient.java
public static void main(String[] args) {
//1.创建客户端Socket,指定服务器地址和端口
Socket socket = new Socket("localhost", 8888);

//2.获取输出流,向服务器端发送消息
OutputStream os = socket.getOutputStream();//字节输出流

//3.对象方式传输
ObjectOutputStream oos = new ObjectOutputStream(os);//传递对象
User vo = new User("admin", "123456");
oos.writeObject(vo);//序列化
oos.flush();

//3.字符串方式传递
//PrintWriter pw = new PrintWriter(os);//将输出流包装为打印流
//pw.write("用户名:admin,密码:123");
//pw.flush();//刷新缓存,像服务器端输出信息

socket.shutdownOutput();//关闭输出流

//4.获取输入流,并读取服务器端的响应信息
InputStream is= socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info=null;
while ((info = br.readLine())!=null) {
System.out.println("我是客户端,服务端说:"+info);
}
socket.shutdownInput();//关闭输入流

//5.资源关闭
br.close();
is.close();
//pw.close();
os.close();
socket.close();
}

可以使用多线程实现服务器与多客户端之间的通信。
循环调用 accept()方法。
ServerThread.java,继承Thread类
//和本线程相关的socket
Socket socket = null;

public ServerThread(Socket socket){
this.socket = socket;
}

//线程执行的操作,响应客户端的请求
public void run(){
//3.获取输入流,并获取客户端的登录信息。
InputStream is = socket.getInputStream();//字节输入流(用户登录信息)
InputStreamReader isr = new InputStreamReader(is);//字符流转换成字节流,提高效率。
BufferedReader br = new BufferedReader(isr);//为输入流添加缓冲

String info=null;
while ((info = br.readLine())!=null) {
System.out.println("我是服务器,客户端说:"+info);
}

socket.shutdownInput();//关闭输入流

//4.获取输出流,相应客户端请求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);//包装为打印流
pw.write("您好!");
pw.flush();//将缓冲输出

//5.关闭资源(略)
}

基于UDP协议实现网络通信
DatagramPacket:标示数据包
DatagramSocket:进行端到端的通信

服务器端:
1.创建DatagramSocket,指定端口号;
2.创建DatagramPacket;
3.接收客户端发送的数据信息;
4.读取数据,并向客户端相应数据;
5.关闭资源。
客户端:
1.定义发送信息;
2.创建DatagramPacket,包含将要发送的信息
3.创建DatagramSocket;
4.发送数据,并接收服务器端数据。
5.关闭资源。

UDP代码展示
UDPServer.java
public static void main(String[] args) throws Exception {
/* 服务器端接收客户端信息 */

//1.创建服务器端的,指定端口号
DatagramSocket datagramSocket = new DatagramSocket(8800);

//2.创建数据包,用于接收客户端发送的数据
byte data[] = new byte[1024];//创建字节数组,指定接收数据报的大小
DatagramPacket packet = new DatagramPacket(data, data.length);

System.out.println("***服务器端已经启动,等待客户端****");

//3.接收客户端发送的数据
datagramSocket.receive(packet);//此方法在接受到数据报之前会一直阻塞;

//4.读取数据
String info = new String(data, 0, packet.getLength());
System.out.println("我是服务器,客户端说:"+info);


/* 服务端想客户端响应数据 */

//1.指定客户端地址、端口号、数据
InetAddress inetAddress = packet.getAddress();
int port = packet.getPort();
byte data2[] = "欢迎您!".getBytes();

//2.创建数据包,包含响应信息
DatagramPacket datagramPacket2 = new DatagramPacket(data2, data2.length, inetAddress, port);

//3.响应客户端
datagramSocket.send(datagramPacket2);

//4.关闭资源信息
datagramSocket.close();
}
UDPClient.java
public static void main(String[] args) throws Exception {
/*向服务器端发送数据*/

//1.定义服务器地址、端口号、数据
InetAddress address = InetAddress.getByName("localhost");
int port=8800;
byte data[] = "用户名:admin,密码:123".getBytes();

//2.创建一个数据包,包含数据信息
DatagramPacket datagramPacket = new DatagramPacket(data, data.length, address, port);

//3.创建 DatagramSocket 对象
DatagramSocket datagramSocket = new DatagramSocket();

//4.向服务器端发送数据包
datagramSocket.send(datagramPacket);

/*接收服务器端数据*/
//1.创建数据包,用于接收服务器端响应的数据
byte data2[] = new byte[1024];
DatagramPacket datagramPacket2 = new DatagramPacket(data2, data2.length);

//2.接收服务器端接收的数据
datagramSocket.receive(datagramPacket2);

//3.读取数据
String reply = new String(data2, 0, datagramPacket2.getLength());
System.out.println("我是客户端,服务器端说:"+reply);

//4.关闭资源
datagramSocket.close();
}


面试
1:tcp和udp的区别
TCP:是面向连接的流传输控制协议,具有高可靠性,确保传输数据的正确性,有验证重发机制,因此不会出现丢失或乱序。
UDP:是无连接的数据报服务,不对数据报进行检查与修改,无须等待对方的应答,会出现分组丢失、重复、乱序,但具有较好的实时性,UDP段结构比TCP的段结构简单,因此网络开销也小。
2:怎么检测socket是不是断开了?
设置心跳包,设置socket为非阻塞,这样,当断线后,select、send、recv等会返回-1,表示断线

 

Socket.io 多连接

】Socket.io多连接【英文标题】:Socket.iomultipleconnections【发布时间】:2016-09-1517:26:42【问题描述】:我还没有真正找到有关文档的奇怪问题。我认为这可能最终会成为“您不了解产品的工作原理”的简单案例,我希望有人可以填... 查看详情

linux应用开发第十四章can编程应用开发(代码片段)

...函数14.3.2.3编写CAN应用层代码14.3.2.4STM32CAN案例测试14.4Linuxsocketcan基础应用编程14.4.1socketcan概述14.4.2socketcan基本知识点14.4.2.1CAN设备操作14.4.2.2什么是Socket套接口14.4.2.3Socket接口函数14.4.3socket_can简单发送实例14.4.3.1编写抽象框架的实... 查看详情

django框架搭建入门案例(代码片段)

1.什么是web框架对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端;#示例:importsocketdefhandle_request(client):buf=client.recv(1024)client.send('HTTP/1.1200OK\r\n\r\n'.encode('utf8'))client.s 查看详情

一个androidsocket的例子(转)

1.开篇简介  Socket本质上就是Java封装了传输层上的TCP协议(注:UDP用的是DatagramSocket类)。要实现Socket的传输,需要构建客户端和服务器端。另外,传输的数据可以是字符串和字节。字符串传输主要用于简单的应用,比较复杂... 查看详情

181114案例下载文件后端编写(代码片段)

 一个简单的文件下载器importsocketdefmain():#1创建套接字tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#2获取服务器的ipportdest_ip=input("请输入你的的服务器ip:")dest_port=input("请输入你的服务器port:")#3连接服务器tcp_socket.con 查看详情

socket.io快入入门案例

socket.io基本介绍创建一个nodejs项目步骤1:创建项目目录步骤2:初始化nodejs项目目录结构命令:npminit-f结果如下:在nodejs项目安装socket.io模块命令:npminstallsokcet.iosocket.io网站:https://socket.io/socket.io快速入门案例客户端:index.html&l... 查看详情

tcp网络通信编程(字符流)-socket应用(代码片段)

...ff1b;并发送“hello,client”,再退出思路:客户端:1.Socket.getOutputStream()2.将OutputStream->Writer3.这里需要使用转换流OutputStreamWriter(字节流)服务端:要求使用字符流1.socket.getInputStream()2.将InputStream->Reader3.使用转换流InputStr... 查看详情

java系列讲座一:tcp方式socket通信案例讲解

开发网络通信软件,如QQ,阿里旺旺等即时通讯软件时,Socket通信是必备的基础知识,今天跟大家谈谈Socket通信中TCP方式通信的软件开发步骤及主要代码讲解:第一步:开发服务器端程序Server.java,源代码如下:package T16;import... 查看详情

使用 Socket.IO 的主要场景是啥

】使用Socket.IO的主要场景是啥【英文标题】:WhatisthemajorscenariotouseSocket.IO使用Socket.IO的主要场景是什么【发布时间】:2013-09-0609:10:38【问题描述】:我只是想知道为什么以及我们需要Socket.IO的应用程序或案例。我是一个知名开源... 查看详情

golang入门案例之socket

//服务端代码packagemainimport( "fmt" "net" "log" "os" "encoding/binary")funcmain(){ //建立socket,监听端口 netListen,err:=net.Listen("tcp","localhost:8090") CheckError(err) defernetListen.Close() Log("Waitingforc 查看详情

socket多线程方式案例

记下来,方便以后查看 User类1packagecom.xujingyang.ThreadSocket;23importjava.io.Serializable;45publicclassUserimplementsSerializable{6privateStringname;7privateintage;89publicStringgetName(){10returnname;11} 查看详情

socket.io入门篇

...il/591b114bb1d4fe074099d9c9.html前言本篇介绍使用node.js模块组件socket.io实现一个非常非常简易的聊天案例。本系列文章不对socket.io历史背景做过多阐述,只会通过一个个的案例带领大家进入socket.io的殿堂,增进小伙伴在socket.io实际开发... 查看详情

java中socket网络通信,实现客户端上传文件案例(代码片段)

...器的硬盘d:\\\\upload\\\\1.jpg实现步骤:1.创建一个服务器ServerSocket对象,和系统要指定的端口号2.使用ServerSocket对象中的方法accept,获取到请求的客户端Socket对象3.使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象4.... 查看详情

window下udp(socket)接和收数据案例

??配置QT的环境变量,这台电脑à属性à高级系统设置à高级à环境变量à系统变量àpathàC:QtQt5.3.05.3mingw482_32in;C:QtQt5.3.0ToolsQtCreatorin创建一个QT项目:winAndLinuxMyUdpProject项目改动QT的项目文件,改动winAndLinuxMyUdpProject.pro文件: 注... 查看详情

Socket.io 随机聊天室

】Socket.io随机聊天室【英文标题】:Socket.iorandomchatroom【发布时间】:2017-09-2120:06:43【问题描述】:我正在尝试创建一个应用程序(类似omegle),人们可以在其中登录并与随机的人交谈。案例:当两个人(客户)登录然后console.lo... 查看详情

netty3入门案例(代码片段)

...程序。Netty大大简化了网络程序的开发过程比如TCP和UDP的Socket的开发。学习netty前需要对NIO理解得很透彻,可参考我另一篇文章javaNIO或者网上找资料学习一下。下面分别以类似 查看详情

socket通信案例--实现发送与接收数据

客户端:importsocketclient=socket.socket()client.connect(("localhost",6969))whileTrue:msg=input("我要发数据>>:").strip()print("开始发送数据:"+msg)client.send(msg.encode("UTF-8"))client.close()运行截图:  服务器端:importsocketsever=socket.socket()sever.bind(("l... 查看详情

案例:多任务版udp聊天器(代码片段)

...要求实现上述要求总结多任务程序的特点参考代码:importsocketimportthreadingdefsend_msg(udp_socket):"""获取键盘数据,并将其发送给对方"""whileTrue:#1.从键盘输入数据msg=input("请输入要发送的数据:")#2.输入对方的ip地址dest_ip=input("请输入对方... 查看详情