目录
网络编程
(两个进程之间的通信)利用服务端(ServerSocket)和客户端(Socket)实现网络之间的通信,有两种方式TCP(打电话)、UDP(类似QQ,没有登录仍然会发送过去,可以不被接受,稳定性不如TCP,但占用资源比TCP少)
TCP:是一种面向连接的、可靠的、基于字节流的传输层通信协议,位于OSI模型第四层。
UDP:是一个数据包协议,简单面向数据报的通信协议。
OSI七层模型:
(7)应用层、(6)表达层、(5)会话层、(4)传输层、(3)网络层、(2)数据链路层、(1)物理层
ServerSocket:
ServerSocket(端口号):实例化需要填写端口号。
public Socket accept():使用ServerSocket.accept()创建一个端口,如果有客户端连接,返回一个Socket对象与客户端连接
public ServerSocket(int port) throws IOException {
this(port, 50, (InetAddress)null);
}
Socket:
Socket(IP地址,端口号):需要填写访问的IP地址和端口号。
Socket.getOutputStream():返回Socket的输出流。
Socket.getInputStream():返回Socket的输入流。
public Socket(String IP地址, int 端口号) throws UnknownHostException, IOException {
this(IP地址 != null ? new InetSocketAddress(IP地址, 端口号) : new InetSocketAddress(InetAddress.getByName((String)null), 端口号), (SocketAddress)null, true);
}
示例:实现基础的服务端与客户端的通信(TCP):
必须服务端开启,不然会报错。
服务端:
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务器已连接,等待客户端载入。。。");
Socket socket = serverSocket.accept();
PrintStream out = new PrintStream(socket.getOutputStream());
out.println("客户端连接成功!!!");
out.close();
socket.close();
serverSocket.close();
客户端:
Socket socket = new Socket("localhost",6666);
Scanner scanner = new Scanner(socket.getInputStream());
scanner.useDelimiter("\n");
if(scanner.hasNext()){
System.out.println("客户端接收成功!!!");
}
socket.close();
echo模型
实例:
服务器ServerSocket:
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
boolean flag = true;
System.out.println("服务器已开启,随时等待连接。。。");
//客户端访问获取Socket对象
Socket socket = serverSocket.accept();
/*
传输数据到客户端:socket.getOutputStream()
使用打印流输出之后,数据写入,在客户端使用Scanner(socket.getInputStream())获取数据
*/
PrintStream print = new PrintStream(socket.getOutputStream());
/*
接受客户端的传过来的数据:socket.getOutputStream()
服务器打印数据,当数据存入打印流后
可以通过使用socket.getInputStream()可以获取到数据
*/
Scanner scanner = new Scanner(socket.getInputStream());
//根据\n进行划分
scanner.useDelimiter("\n");
while (flag) {
//获取value的值判断,是否存在数据
if (scanner.hasNext()) {
//将客户端传过来的数据传入value中
String value = scanner.next().trim();
System.out.println(value);
if ("Bye".equalsIgnoreCase(value)) {
print.println("终止通信!!!");
flag = false;
} else {
//打印value的值并返回到客户端
print.println("【通讯中】"+value);
}
}
}
socket.close();
serverSocket.close();
}
}
客户端Socket:
public class Connection {
public static void main(String[] args) throws IOException {
boolean flag = true;
Socket socket = new Socket("127.0.0.1", 8888);
/*
传输数据到服务器:socket.getOutputStream()
使用打印流输出之后,数据写入,在服务器使用Scanner(socket.getInputStream())获取
*/
PrintStream print = new PrintStream(socket.getOutputStream());
/*
接受服务器的传过来的数据:socket.getOutputStream()
客户端打印数据,将数据存入打印流(存着socket.getOutputStream())
使用socket.getInputStream()可以获取到数据
*/
Scanner scanner = new Scanner(socket.getInputStream());
scanner.useDelimiter("\n");
while (flag) {
String value = notNull("请输入要发送的数据:").trim();
//传输value的数据到服务器
print.println(value);
if (scanner.hasNext()) {
System.err.println(scanner.next().trim());
}
if ("Bye".equalsIgnoreCase(value)) {
flag = false;
}
}
socket.close();
}
public static String notNull(String str) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
boolean flag = true;
String value = null;
while (flag) {
value = str;
if (!(value == null || "".equals(value))) {
System.out.println(value);
value = bufferedReader.readLine();
flag = false;
} else {
System.out.println("数据不允许为空!!!");
}
}
return value;
}
}
结果:
请输入要发送的数据:
1\
【通讯中】1\
请输入要发送的数据:
2
【通讯中】2
请输入要发送的数据:
3
【通讯中】3
请输入要发送的数据:
bye
"终止通信"