Java学习笔记之网络编程(二):TCP

package com.network.tcp;
 
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
 
/*
UDP通讯协议的特点:
	1、将数据及其源和目的封装成数据包,不需要建立连接;
	2、每个数据包大小不能超过64K;
	3、因为无连接,所以不可靠,数据包有可能丢失;
	4、因为不需要建立连接,所以速度快;
	5、UDP通讯是不分服务端与客户端的,只分发送端和接收端;
	
TCP通讯协议的特点:
	1、TCP是基于IO流进行数据传输的,面向连接;
	2、TCP进行数据传输的时候是没有大小限制的;
	3、TCP是面向连接,通过三次握手的机制保证数据的完整性;可靠协议;
	4、TCP是面向连接的,所以速度慢;
	5、TCP是区分客户端与服务端的;
	
	比如:打电话,文件传输,迅雷下载...
	
TCP协议的Socket:
	Socket:客户端Socket;TCP的客户端一旦启动马上要与服务端进行连接;
	ServerSocket:服务端Socket
 */
 
public class ClientDemo {
 
	// TCP客户端
	public static void main(String[] args) throws Exception {
		// 1、建立TCP服务,指定服务端的地址和端口号
		Socket socket = new Socket(InetAddress.getLocalHost(), 9090);
		
		// 2、创建Socket的输出流对象
		OutputStream outputStream = socket.getOutputStream();
		
		// 3、利用输出流对象把数据写出
		String data = "你好服务端";
		outputStream.write(data.getBytes());
		
		// 获取SOcket的输入流对象,读取服务器发送的数据
		InputStream inputStream = socket.getInputStream();
		byte[] buf = new byte[1024];
		int len = inputStream.read(buf);
		System.out.println("服务端说:" + new String(buf, 0, len));
		
		// 4、关闭资源
		socket.close();
	}
	
}
package com.network.tcp;
 
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
/*
 * TCP服务端
 * 
 * ServerSocket的使用步骤:
 * 	1、建立TCP服务;
 * 	2、接收客户端的连接,产生一个Socket对象;
 * 	3、获取对应的流对象读取或者写出数据;
 * 	4、关闭资源;
 */
 
public class ServerDemo {
 
	public static void main(String[] args) throws Exception {
		
		// 1、建立TCP服务
		ServerSocket serverSocket = new ServerSocket(9090);
		
		// 2、接收客户端的连接;accept()是一个阻塞的方法,没有客户端连接,一直等待;
		Socket socket = serverSocket.accept();
		
		// 3、获取输入流对象,读取客户端发送的数据
		InputStream inputStream = socket.getInputStream();
		byte[] buf = new byte[1024];
		int len = inputStream.read(buf);
		System.out.println("客户端说:" + new String(buf, 0, len));
		
		// 获取Socket的输出流对象,向客户端发送数据
		OutputStream outputStream = socket.getOutputStream();
		outputStream.write("你好客户端".getBytes());
		
		// 4、关闭资源
		serverSocket.close();
	}
	
}

TCP客户端与服务器一问一答聊天:

package com.network.tcp;
 
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
 
/*
 * 一问一答聊天的客户端
 */
 
public class ChatClient {
 
	public static void main(String[] args) throws Exception {
		
		// 建立TCP客户端服务
		Socket socket = new Socket(InetAddress.getLocalHost(), 9090);
		// 获取socket的输出流对象
		OutputStream outputStream = socket.getOutputStream();
		// 将字节流转换成字符流
		OutputStreamWriter writer = new OutputStreamWriter(outputStream);
		// 获取键盘输入流对象
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		
		// 获取socket的输入流对象,用于读取服务端发送的数据
		InputStream inputStream = socket.getInputStream();
		InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
		BufferedReader socketReader = new BufferedReader(inputStreamReader);
		
		// 不断的读取键盘录入的数据,然后把数据写出
		String line = null;
		while ((line = reader.readLine()) != null){
 
			// 由于服务端是调用BufferedReader的ReadLine()方法读取数据的,而readLine()判断一行数据
			// 的依据是读取到\r\n;但是客户端也是调用readLine()读取客户写入的数据,并且读取客户写入的数据时
			// 没有包括\r\n,所以此处要自己加上\r\n,否则服务端无法读取数据;
			writer.write(line + "\r\n");
			writer.flush(); // 刷新缓冲流,不然数据无法发送成功
			
			
			// 读取服务端发送的数据
			line = socketReader.readLine();
			System.out.println("服务端说:" + line);
		}
		// 关闭资源
		socket.close();
		
	}
	
}
package com.network.tcp;
 
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
/*
 * 一问一答聊天的服务端
 */
 
public class ChatServer {
	public static void main(String[] args) throws Exception {
		
		// 建立TCP服务端,监听一个端口
		ServerSocket serverSocket = new ServerSocket(9090);
		// 接收客户端的连接,产生一个Socket
		Socket socket = serverSocket.accept();
		// 建立socket的输入流对象读取数据
		InputStream inputStream = socket.getInputStream();
		// 将字节流转换成字符流
		InputStreamReader reader = new InputStreamReader(inputStream);
		BufferedReader bufferedReader = new BufferedReader(reader);
		
		// 获取socket的输出流对象,用于向客户端发送数据
		OutputStream outputStream = socket.getOutputStream();
		OutputStreamWriter writer = new OutputStreamWriter(outputStream);
		// 获取键盘的输入流
		BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
		
		// 循环读取数据
		String line = null;
		while ((line = bufferedReader.readLine()) != null){
			System.out.println("客户端说:" + line);
			
			// 向客户端发送数据
			line = keyReader.readLine();
			writer.write(line + "\r\n");
			writer.flush();
		}
		// 关闭资源
		serverSocket.close();
		
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值