Socket(套接字): 表示客户机和服务器连接通信。当两个程序需要通信时,他们可以通过使用Socket类建立套接字对象并连接在一起,通过具体的协议 写入写出数据 。
Socket由端口号和IP地址组成。网络通信中使用IP地址标识Internet上的计算机,使用端口号标识服务器上的进程(程序);端口号规定为一个16位的0~655535之间的整数,其中,0~1023被预先定义的服务通信占用,除非访问这些特定的服务,否则,就应该使用1024~65535这些端口的某一个进行通信,以免发生端口冲突。
客户端上的使用
1.getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到输入流其实就是从服务器端发回的数据。
2.getOutputStream方法得到的是一个输出流,客户端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给服务器端的数据。
服务器端上的使用
1.getInputStream方法得到的是一个输入流,服务端的Socket对象上的getInputStream方法得到的输入流其实就是从客户端发送给服务器端的数据流。
2.getOutputStream方法得到的是一个输出流,服务端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给客户端的数据
Socket相关的通信协议
1、TCP
TCP是(Tranfer Control Protocol)的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
TCP的三次握手
建立起一个TCP连接需要经过“三次握手”:第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求
实现客户机和服务器都具有收发功能,且长连接。
`public class Client {
private Socket socket;
public Client() {
System.out.println(“客户机在启动”);
while (true) {
try {
//1:创建Socket客户端对象
socket = new Socket(“127.0.0.1”, 8891);
System.out.println(“client:握手成功”);
System.out.println(“客户机输入信息”);
//2、向服务器写数据
//(1)从键盘构建消息
_BufferedReader br = new BufferedReader(new InputStreamReader(System.**_in));
String line = br.readLine();
_//(2)把消息发送给服务器
_PrintWriter pw = new PrintWriter(socket.getOutputStream());
//(3)向文件写入line
_pw.println(line);
pw.flush();
//接受服务器数据
_BufferedReader br1=new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(“客户机接收的消息”+br1.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Client C=new **Client();
}
}
<br />
public class Server {
private ServerSocket serverSocket=null;
private Socket socket;
**public **Server() {<br /> System.**_out_**.println(**"服务器在启动"**);<br /> **try **{<br /> **serverSocket **= **new **ServerSocket(8891);<br /> **while **(**true**) {<br /> **socket **= **serverSocket**.accept();<br /> _// System.out.println("服务器握手成功");<br /> //接受客户机的消息<br /> _BufferedReader br = **new **BufferedReader(**new **InputStreamReader(**socket**.getInputStream()));<br /> String line = br.readLine();<br /> System.**_out_**.println(**"服务器接收的消息为:" **+ line);<br /> _//向客户机写数据<br /> _BufferedReader br1 = **new **BufferedReader(**new **InputStreamReader(System.**_in_**));<br /> String line1 = br1.readLine();<br /> PrintWriter pw = **new **PrintWriter(**socket**.getOutputStream());<br /> pw.println(line1);<br /> pw.flush();<br /> }<br /> } **catch **(IOException e) {<br /> e.printStackTrace();<br /> }<br /> }<br /> **public static void **main(String[] args) {<br /> **new **Server();<br /> }<br />}`
2、UDP: 不安全协议 只管发,谁接不管 电话短信 UDP协议
3、http: 短连接,连接后就断开
4、websocket 长连接
[
](https://blog.csdn.net/u014209205/article/details/80461122)