一、概述
Socket也是一种数据源
Socket是网络通信的端点
Unix中的Socket
Unix系统中 一切都是文件。
因为Scoket是网络通信的端点,可以进行数据的输入输入,所以Socket也可以看成文件
文件描述符是已打开文件的索引
每个进程都会维护一个文件描述符表
通过Socket发送数据
1、创建socket
2、告诉驱动程序指定IP地址和端口号绑定到Scoket
3、消息发送到Socket
4、驱动程序收到Socket的精确定位数据
通过Socket接收数据
1、创建Socket
2、绑定IP、端口号
3、信息传输给Socket
4、读取数据
ServerSocker:服务器端在网络通信上的端点
Socket:客户端在网络通信上的端点
二、建立ServerSocket连接
连接过程如下:
- 服务器端先调用bind绑定端口
- 然后进入accept阻塞状态等待客户端连接
- 客户端连接客户端,传入主机地址和端口号
- accept接收成功返回客户端的socket
- 通过IO流进行信息传输
- 通过close关闭服务器端口
- 关闭服务器端口
简单代码实例如下:
服务器端:
package demo1.simple;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
final int DEFAULT_PORT = 9999;
Socket socket = null;
ServerSocket serverSocket = null;
BufferedWriter writer = null;
BufferedReader reader = null;
try {
serverSocket = new ServerSocket(DEFAULT_PORT);
System.out.println("服务器[" + DEFAULT_PORT + "]开启,正在等待客户端链接");
while (true) {
socket = serverSocket.accept();
System.out.println("客户端[" + socket.getPort() + "]已连接到服务器");
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str =null;
while ((str =reader.readLine())!=null) {
if ("quit".equalsIgnoreCase(str)) {
System.out.println("客户端" + socket.getPort() + "已断开连接");
break;
}
System.out.println("客户端[" + socket.getPort() + "]:" + str);
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("服务器回复信息:" + str + "\n");
writer.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
if (serverSocket != null) {
System.out.println("服务器已经关闭");
serverSocket.close();
}
if (writer != null) {
writer.close();
}
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端:
package demo1.simple;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
public class Service {
public static void main(String[] args) {
final int DEFAULT_PORT=9999;
final String DEFAULT_HOST="localhost";
boolean flag=true;
Socket socket=null;
BufferedReader reader=null;
BufferedWriter writer=null;
try {
socket=new Socket(DEFAULT_HOST,DEFAULT_PORT);
System.out.println("客户端已开启");
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String str=null;
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
while (flag) {
str = bufferedReader.readLine();
if ("quit".equalsIgnoreCase(str)) {
flag=false;
writer.write(str);
writer.flush();
break;
}
writer.write(str + "\n");
writer.flush();
System.out.println(reader.readLine());
}
}catch (IOException e) {
e.printStackTrace();
}
finally {
try {
if (socket != null) {
System.out.println("Service已关闭");
socket.close();
}
if (writer != null) {
writer.close();
}
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
代码实验结果:
客户端:
服务器端: