其实上一篇博客提到的ip,端口,路由等知识,java都给我们封装好了。但是我们还是要了解,这篇博客就正式开始socket单工的学习。
单工就是单向的传输一次数据
比如: BB机
可能有些年轻人不知道什么叫BB机吧,作为一个老去的95后我还是知道的。如果实在不知道自己百度下。
对于socket来说势必会有一个发送者和一个接受者。
首先书写一个服务器类:Server.java
package socket.single;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author Hercules
* @version 创建时间:2020年5月26日 下午3:50:04
* 服务器
*/
public class Server {
public static void main(String[] args) {
try {
//这里只需要一个参数,就是服务器去监听的端口号码
//服务器是不需要知道ip的,因为一般都是客户端来访问服务器
ServerSocket serverSocket = new ServerSocket(8888);
//监听客户端的访问
System.out.println("开始监听");
Socket socket = serverSocket.accept();//会阻塞线程 直到有客户端来访问
System.out.println("有客户端来访问了");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
而后再写一个客户端类:
package socket.single;
import java.io.IOException;
import java.net.Socket;
/**
* @author Hercules
* @version 创建时间:2020年5月26日 下午3:49:34
* 客户端
*/
public class Client {
public static void main(String[] args) {
try {
//这里客户端既要知道端口号,又要知道ip,因为客户端是要访问服务器的
//本机ip自然是127.0.0.1,
//服务器端口是8888。
Socket socket = new Socket("127.0.0.1",8888);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
首先只运行Server.java
这时候服务器上线:
而后再运行客户端也就是Client.java
这个时候可以看到服务器监听到了有客户端来了。
这就是一个单工的通信了,不知道各位有没有听说过三次握手。
三次握手的目的就是为了保证数据传输完整有效。
1、第一次握手就是客户端发送一个请求给服务器服务器接收到请求了是第一次
2、但是服务器接收到数据了但是客户端并不知道服务器是否收到了数据,这时候服务器就会响应些回复发给客户端,客户端接收到了就是第二次。
3、这里又出现了问题,就是服务器并不知道这次发送数据给客户端有没有成功,所以客户端又发送数据到服务器去,告诉它我接收到了。
到这里三次握手也就完成了。
接下来客户端可以给服务器发送消息:
代码修改如下:
服务器:
package socket.single;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author Hercules
* @version 创建时间:2020年5月26日 下午3:50:04
* 服务器
*/
public class Server {
public static void main(String[] args) {
try {
//这里只需要一个参数,就是服务器去监听的端口号码
//服务器是不需要知道ip的,因为一般都是客户端来访问服务器
ServerSocket serverSocket = new ServerSocket(8888);
//监听客户端的访问
System.out.println("开始监听");
Socket socket = serverSocket.accept();//会阻塞线程 直到有客户端来访问
System.out.println("有客户端来访问了");
//既然客户端发送了数据那么服务器就要接收数据
InputStream is = socket.getInputStream();
//这里还要把字节流转成字符流,将编码设置成UTF-8
InputStreamReader isr = new InputStreamReader(is,"utf-8");
BufferedReader br = new BufferedReader(isr);
System.out.println(br.readLine());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
package socket.single;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
/**
* @author Hercules
* @version 创建时间:2020年5月26日 下午3:49:34
* 客户端
*/
public class Client {
public static void main(String[] args) {
try {
//这里客户端既要知道端口号,又要知道ip,因为客户端是要访问服务器的
//本机ip自然是127.0.0.1,
//服务器端口是8888。
Socket socket = new Socket("127.0.0.1",8888);
//客户端给服务器发消息
OutputStream os = socket.getOutputStream();
//这里既然是发送的字符串,就必须把输出流后面的参数设置成true,这里的意思是自动刷新开启
PrintWriter out = new PrintWriter(os,true);
//这里尽量写println,因为这样数据是一行一行的过来的。
out.println("服务器,我是客户端");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
先运行服务器:
而后运行客户端:
就可以看到客户端给服务器的消息了