_066_Socket之TCP

===============================

tcp通信协议       
面向连接,基于IO流传输。有特有的通道,能传输大数据,通过三次握手机制连接,可靠协议,
因为必须通信前必须建立链接,所以效率稍低
例:电话,文件的传送 

tcp协议下的通讯

1 Socket(客户端)  tcp的客户端一旦启动就要与客户端进行连接
2 SeverSocket(服务类)

Socket类

SocketChannel 类

ServerSocket

ServerSocketChannel类

TCP通信测试

服务端

public class Test2
{
	public static void main(String[] args) throws IOException
	{
		//服务端指定一个端口
		ServerSocket serverSocket = new ServerSocket(8080);
		
		//接收客户端发过来的Socket,也是阻塞的
		Socket socket = serverSocket.accept();
		OutputStream os = socket.getOutputStream();
		InputStream is = socket.getInputStream();
		os.write("客户端你好".getBytes());

		byte[] arr = new byte[1024];
		int length = 0;
		length = is.read(arr);
		System.out.println(socket.getLocalAddress() + new String(arr, 0, length));

		serverSocket.close();
	}
}

客户端

class Test1
{
	public static void main(String[] args) throws UnknownHostException, IOException
	{
		//创建一个Socket对象,需要主机对象和端口
		Socket socket = new Socket(InetAddress.getLocalHost(), 8080);
		
		// 创建一个客户端的Socket对象,因为是基于IO流,
		//所以是向缓存中写入数据先,这也就是需要发送的内容
		OutputStream os = socket.getOutputStream();
		os.write("服务器你好".getBytes());
	
		// 接收服务器发过来的数据,因为读出来是字节流,文字要这样处理,当然也可以转换成字符流
		InputStream is = socket.getInputStream();
		byte[] arr = new byte[1024];
		int length = 0;
		length = is.read(arr); //读取进数组里
		System.out.println(new String(arr, 0, length));//然后解码

		socket.close();
		// 关闭socket资源,会把流一起关闭,所以只要关闭这一个
	}
}

1 使用字符流写出的时候注意一定要刷出,因为不同于字节流,字节流需要使用缓冲字节流才需缓冲,而字符流不是
2 客户端向服务器发送一行数据的时候(使用了readline),因为\r\n是读取不出来的,所以服务器那边也没有接受到\r\n
   所以如果服务器那么也是readline读取的,就读取不了,因为readline是根据\r\n才判断是1行的,才会读取,而服务器是
   通过客户端发送数据读取的,所以客户端必须在发送数据的时候加上\r\n

客户端

class Test1
{
	public static void main(String[] args) throws UnknownHostException, IOException
	{
		Socket socket = new Socket(InetAddress.getLocalHost(), 8080);
		
		//获取输出流
		OutputStreamWriter write = new OutputStreamWriter(socket.getOutputStream());
		BufferedReader read = new BufferedReader(new InputStreamReader(System.in));// 从键盘读入字节数据,然后转换到字符数据,然后存入缓存字符
		String value = null;
		while ((value = read.readLine()) != null)
		{
			write.write(value + "\r\n"); //手动加上\r\n
			write.flush();
		}
		socket.close();
	}
}

服务端

public class Test2
{
	public static void main(String[] args) throws IOException
	{
		ServerSocket serverSocket = new ServerSocket(8080);
		
		//阻塞接受数据
		Socket socket = serverSocket.accept();
		
		//获取输入流
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		String value = null;
		while ((value = bufferedReader.readLine()) != null)
		{
			System.out.println("服务端接受到的数据: " + value);
		}
		serverSocket.close();
	}
}

猜你喜欢

转载自blog.csdn.net/yzj17025693/article/details/82782139