思路:客户端先接收键盘的数据,变为输出流再转化为打印流,安行发送,接收来自服务端的数据,按行读取,最后关闭输入输出,释放资源
服务端按行接收数据,进行处理,变为输出流再转化为打印流,安行发送,最后关闭输入输出,释放资源
场景:存入缓冲区之间,快速实现,拥有好的用户体验,搜索,注册账号。
如图:
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。
//套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
public class Client{
public static void main(String[] args) throws IOException{
Socket socket = new Socket();
socket.setSoTimeout(3000); 超时时间为3秒
socket.connect(new InetSocketAddress(Inte4Address.getLocalHost(),port=2000),timeout=3000);
System.out.println("打印本机地址和本机端口号"+socket.getLocalAddress()+"p:"+socket.getLocalPort());
try{
accdata(socket);
}
catch(Exception e){
System.out.println("异常关闭");
}
socket.close();
System.out.println("客户端已退出");
}
public static void accdata(Socket client) throws Exception{
// BufferedReader类从字符输入流中读取文本并缓冲字符,以便有效地读取字符,数组和行,
InputStrem = System.in;
BufferedReader input = new BufferedReader(new InputStream(in);
// 得到socket输出流,并转换为打印流
OutputStream outputStream = client.getOutputStream();
PrintStream socketPrintStream = new PrintStream(outputStream);
// 服务器的返回数据
InputSteam inputStream = client.getInputStream();
BufferedReader socketBufferedReader = new BufferedReader(new InputStream(intputSteam);
boolean flag = true;
while(flag){
// 键盘读取一行,并发送给服务器
// printwriter如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,
// 而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。 打印给服务器。
String str = input.readLine();
socketPrintStream.println(str);
// 服务器返回的数据按行读取
String echo = socketBufferedReader.readLine();
if("bye".equalsIgnoreCase(echo)){
flag = false;
}
else{
System.out.println(echo);
}
socketPrintStream.close();
socketBufferedReader.close();
}
}
}
public class server{
public static void main(String[] args) throws IOException{
ServerSocket server = new ServerSocket(port:2000);
while(true){
Scocket client = server.accept();
//客户端构建异步线程
ClientHandler clientHandler = new ClientHandler(client);
clientHandler.start();
}
}
private static class ClientHandler extends Thread{
` private Socket socket;
private boolean flag = true;
ClientHandler(Socket socket){
this.socket = socket;
}
}
public void run(){
super.run();
System.out.println("d"+socket.getIntetAddress()+
"p:"+socket.getPort());
try{
// 转换为打印流
printStream socketoutput = new PrintStream(socket.getOutputStream());
BufferedReader socketInput = new BufferedReader
(new InputStreamReader(socket.getInputStream()));
while(flag){
String str = socketInput.readLine();
if("bye".equalsIgnoreCase(str)){
flag = false;
socketOutput.println(x:"bye");
}
else{
System.out.println(str);
socketOutput.println("回送"+str.length());
}
}
socketInput.close();
socketOutput.close();
}
catch(Exception e){
System.out.println("连接异常断开");
}
try{
socket.close();
}catch(Exception e){
e.printStackTrace();
}
System.out.println("d"+socket.getIntetAddress()+
"p:"+socket.getPort());
}
}
}
异步:一种通讯方式,对设备需求。我们的PC机提供的标准通信接口都是异步的。
异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位。
Tcp协议:
TCP三次握手的过程如下:
客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了
来源:https://blog.csdn.net/weixin_43360488/article/details/100012556