什么是socket
socket作为(UDP、TCP)一种抽象层,应用程序通过它来发送和接收数据,使用socket可以将应用程序与处于同一网络中的其他应用程序进行通信交互。简而言之,socket提供了应用程序内部与外界通信的端口以及为通信双方提供了数据传输的通道。
对比
服务器通信主要有两种方式:Http通信与Socket通信。
差异:
Http通信
请求—响应方式”
请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。
Socket通信
双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。
数据丢失率低,使用简单,易于移植。
模型
Socket基本通信模式如下:
从上面模型可以看出Socket可以是基于Tcp协议的Socket通信或基于Udp协议的Socket通信。
Tcp通信模型如下:
原理
服务器端首先声明一个ServerSocket对象并且指定端口号,然后调用Serversocket的accept()方法接收客户端的数据。accept()方法在没有数据进行接收的处于堵塞状态。(Socketsocket=serversocket.accept()),一旦接收到数据,通过inputstream读取接收的数据。 客户端创建一个Socket对象,指定服务器端的ip地址和端口号(Socket socket=new Socket("127.0.0.1",9999);),通过inputstream读取数据,获取服务器发出的数据(OutputStream outputstream = socket.getOutputStream()),最后将要发送的数据写入到outputstream即可进行TCP协议的socket数据传输。注意:再传输完成后要注意输入输出流的关闭以及socket的关闭,如果不主动关闭socket的话,系统不会自动关闭的,除非当前进程挂掉了,操作系统把占用的socket回收了才会关闭。
实践
一个简单的Server与Client对话Demo
Server:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Created by 15c on 2017/12/18.
*/
public class Server {
static ServerSocket serverSocket= null;
static Socket socket = null;
public static void main(String[]args) {
try {
//1创建服务端对象。
serverSocket = newServerSocket(8868);
//2,获取连接过来的客户端对象。
socket =serverSocket.accept();
BufferedReaderbufferedReader = null;
BufferedReaderbufferedReader_SystemIN = null;
BufferedWriterbufferedWriter = null;
//3,通过socket对象获取输入流,要读取客户端发来的数据
bufferedReader = newBufferedReader(new InputStreamReader(socket.getInputStream()));
//4,通过字符输入流获取键盘输入,要读取控制台写给客户端的数据
bufferedReader_SystemIN= new BufferedReader(new InputStreamReader(System.in));
//5.使用客户端socket对象的输出流给客户端返回数据
bufferedWriter = newBufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String message ="";
while ((message =bufferedReader.readLine()) != null) {
String s =bufferedReader_SystemIN.readLine();
bufferedWriter.write(s);
bufferedWriter.newLine();
bufferedWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
serverSocket.close();
socket.close();
} catch (IOException e){
e.printStackTrace();
}
}
}
}
Client:
import java.io.*;
import java.net.Socket;
/**
* Created by 15c on 2017/12/18.
*/
public class Client {
public static void main(String[]args) {
Socket socket = null;
BufferedReaderbufferedReader = null;
BufferedReader bufferedReader_Server= null;
BufferedWriterbufferedWriter = null;
try {
//1,创建socket客户端对象。
socket = newSocket("127.0.0.1", 8868);
//2,获取键盘录入。获取控制台用户输入的信息
bufferedReader = newBufferedReader(new InputStreamReader(System.in));
//3,socket输入流。读取服务端返回的数据
bufferedReader_Server =new BufferedReader(new InputStreamReader(socket.getInputStream()));
//4,socket输出流。将控制台信息数据输出给服务端
bufferedWriter = newBufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String message ="";
while ((message =bufferedReader.readLine()) != null) {
bufferedWriter.write(message);
bufferedWriter.newLine();
bufferedWriter.flush();
String getMessage =bufferedReader_Server.readLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedWriter !=null) {
bufferedWriter.close();
}
if (bufferedReader_Server!= null) {
bufferedReader_Server.close();
}
if (bufferedReader!= null) {
bufferedReader.close();
}
if (socket != null){
socket.close();
} } catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行效果:
作者:码无止境
链接:https://juejin.im/post/57f885370bd1d00058b37d74
来源:掘金
未完待续,欢迎持续关注本公众号,了解不一样的编程思维。
领取专属 10元无门槛券
私享最新 技术干货