1.socket是什么?
socket又叫套接字,是在应用层和传输层的抽象层。它把复杂的TCP/IP协议族隐藏在Socket接口后面,从而进行简单的接口调用就可以达到进程通信的效果。
socket是一种”打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个”文件”,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
2.socke编程原理
这是TCP下面向连接的socket的流程图
我们可以大致得出socket的流程是
1.创建socket,做好绑定主机端口,监听和等待客户端socket连接的准备
2.accept()堵塞中,直到客户端连接
3.对socket进行读写操作
4.关闭socket
这是UDP下面向非连接的socket的流程图
由于UDP特性是无连接的,客户端和服务器不用建立连接,所以客户端和服务器界限是模糊的,两者的运行原理也会相同的。它无法保证数据报文的安全性,通信对方能否收到数据包。它只关心通信的对方的IP和端口号就可以通信
3.socke编程示例
java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。两个类多个构造器
socket
public Socket()
public Socket(String host, int port)
throws UnknownHostException, IOException
------------------------------------------------------------------------
public Socket(InetAddress address, int port)
throws IOException
public Socket(String host, int port, InetAddress localAddr,int localPort)
throws IOException
public Socket(InetAddress address, int port, InetAddress localAddr,int localPort)
throws IOException
public Socket(String host, int port, boolean stream)
throws IOException
address:另一方的IP地址
host:另一方的主机名
port:另一方的端口号
localPort:本机的端口号
localAddr:本机的IP地址
stream:决定使用的是TCP还是UDP
ServerSocket
public ServerSocket(int port) throws IOException
------------------------------------------------
public ServerSocket(int port, int backlog)
throws IOException
public ServerSocket(int port, int backlog, InetAddress bindAddr)
throws IOException
port:本地的端口号
TCP面向连接代码示例
客户端
package socket;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientSocketTest {
public static void main(String[] args){
Socket s = null;
try {
s = new Socket("127.0.0.1",8087);
} catch (Exception e1) {
System.out.println("客户端出错"+e1.getMessage());
}
try {
PrintStream serverOut = new PrintStream(s.getOutputStream());
BufferedInputStream clientIn = new BufferedInputStream(System.in);
//BufferedInputStream serverIn = new BufferedInputStream(s.getInputStream());
byte[] b = new byte[1024];
clientIn.read(b);
serverOut.print(new String(b));
serverOut.close();
//serverIn.close();
clientIn.close();
} catch (IOException e) {
System.out.println("读写出错"+e.getMessage());
}
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器
package socket;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketTest {
public static void main(String[] args){
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(8087);
System.out.println("服务器已启动");
} catch (IOException e) {
System.out.println("服务器未启动"+e.getMessage());
}
Socket clientSocket = null;
try {
System.out.println("服务器开始堵塞,等待用户连接");
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.out.println("服务器出错"+e.getMessage());
}
try {
System.out.println("服务器与客户端已经连接,正在进行读写操作");
PrintStream clientOut = new PrintStream(clientSocket.getOutputStream());
//BufferedInputStream serverIn = new BufferedInputStream(System.in);
BufferedInputStream clientIn = new BufferedInputStream(clientSocket.getInputStream());
byte[] b = new byte[1024];
clientIn.read(b);
System.out.print("客户端说:"+new String(b));
clientOut.close();
//serverIn.close();
clientIn.close();
} catch (IOException e) {
System.out.println("读写出错"+e.getMessage());
}
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
-
运行结果
- ServerSocketTest
服务器已启动
服务器开始堵塞,等待用户连接
服务器与客户端已经连接,正在进行读写操作
客户端说:sadfsdafasd -
ClientSocketTest
输入:sadfsdafasd