socket模拟客户端和服务端

思路:客户端先接收键盘的数据,变为输出流再转化为打印流,安行发送,接收来自服务端的数据,按行读取,最后关闭输入输出,释放资源
服务端按行接收数据,进行处理,变为输出流再转化为打印流,安行发送,最后关闭输入输出,释放资源

场景:存入缓冲区之间,快速实现,拥有好的用户体验,搜索,注册账号。

如图:
socket模拟客户端和服务端_第1张图片
套接字(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客户端和服务器端成功地建立连接,可以开始传输数据了
socket模拟客户端和服务端_第2张图片

你可能感兴趣的:(java模式)