Socket网络编程回顾
概述
Socket(套接字)是两台主机之间的逻辑连接点。Socket是通信的基石,支持TCP/IP协议的网络通信的基本操作单元。
它是网络通信过程中的端点的抽象表示,包含进行网络通信的五个基本要素信息:
1.连接用的协议
2.本地主机的IP+端口
3.远程主机的IP+端口
Socket基本使用流程
Socket编程主要涉及到两个端:服务端和客户端(Server and Client).
首先,在服务端创建一个服务器套接字(ServerSocket),并把它附加到一个端口上,服务器从这个端口进行监听。
端口号的范围0-65535,共65526个,但是0到1023是保留端口号,所以我们一般取端口要大于1023并且不要取一些框架服务常用的端口号,比如3306,6379,8080,2081等等。
为什么端口号是65536个,或者为什么端口号范围是0-65535(2^16 -1 ), 因为TCP、UDP协议的开头,会分别有16位存储源端口号和目标端口号,所以是65536个,范围是0-65535.
客户端请求与服务器进行连接的时候,根据服务器的域名或者IP地址,加上端口号,打开一个套接字。当服务器接受了,也就是连接上了。
那么服务端和客户端就会想输入和输出流一样进行操作。
代码简单实现
1. 服务端代码
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 创建线程池
ExecutorService executorService = Executors.newCachedThreadPool();
// 创建ServerSocket对象
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("这里是服务端!");
while(true){
Socket socket = serverSocket.accept();
System.out.println("有客户端连接");
executorService.execute(new Runnable() {
@Override
public void run() {
handle(socket);
}
});
}
}
private static void handle(Socket socket){
try {
System.out.println("线程ID:" + Thread.currentThread().getId() +
" ,线程名称:" + Thread.currentThread().getName());
InputStream is = socket.getInputStream();
byte[] b = new byte[1024];
int read = is.read(b);
System.out.println("客户端:" + new String(b,0,read));
// 连接中取出输入流并回话
OutputStream os = socket.getOutputStream();
os.write("没钱".getBytes());
}catch (Exception e){
e.printStackTrace();
}finally {
try {
// 关闭连接
socket.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
服务端代码可以分成两部分:1.创建线程池等待连接 2. 处理连接上的客户端请求
2.客户端代码
public class ClientDemo {
public static void main(String[] args) throws IOException {
while (true){
// 连接 远程端口
Socket socket = new Socket("127.0.0.1", 9999);
// 从连接中socket取出outputStream 输出流并发送
OutputStream outputStream = socket.getOutputStream();
System.out.println("请输入:");
Scanner scanner = new Scanner(System.in);
String msg = scanner.nextLine();
outputStream.write(msg.getBytes());
// 从链接中取出输入流并回收流
InputStream inputStream = socket.getInputStream();
byte[] b = new byte[1024];
int read = inputStream.read(b);
System.out.println("老板说:" + new String(b, 0, read).trim());
// 关闭socket
socket.close();
}
}
}
这里只有一个方法,但仔细查看也可以分成三部分:
1. 连接远程主机端口
2. 发送客户端想要的信息
3. 获取服务端返回的信息并显示出来