JAVA学习之TCP编程

 

近来项目不急,就想学习哈JAVA的TCP编程。接下来我们直入主题。

大家一听到TCP编程,是不是就有疑问,什么是TCP???其实TCP的解释就是:

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

Java中基于TCP协议实现网络通信的类,一般为Socket类,而Socket类是网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。

 

 

Socket通信的步骤
                 ① 创建ServerSocket和Socket
                 ② 打开连接到Socket的输入/输出流
                 ③ 按照协议对Socket进行读/写操作
                 ④ 关闭输入输出流、关闭Socket

服务器端:
                 ① 创建ServerSocket对象,绑定监听端口
                 ② 通过accept()方法监听客户端请求
                 ③ 连接建立后,通过输入流读取客户端发送的请求信息
                 ④ 通过输出流向客户端发送乡音信息
                 ⑤ 关闭相关资源

客户端:                                                                                                                                                                                                                       ① 创建Socket对象,指明需要连接的服务器的地址和端口号
                 ② 连接建立后,通过输出流想服务器端发送请求信息
                 ③ 通过输入流获取服务器响应的信息
                 ④ 关闭响应资源 

应用多线程实现服务器与多客户端之间的通信:                                                                                                                                                 ① 服务器端创建ServerSocket,循环调用accept()等待客户端连接
               ② 客户端创建一个socket并请求和服务器端连接
               ③ 服务器端接受苦读段请求,创建socket与该客户建立专线连接
               ④ 建立连接的两个socket在一个单独的线程上对话
               ⑤ 服务器端继续等待新的连接
     

 

相关小例子:

public class Server {
	private ServerSocket serverSocket;
	/*
	 * *构造函数
	 */
	public Server() {
		try {
			serverSocket = new ServerSocket(8081);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void Start() {
		try {
			//创建线程池
			ExecutorService threadPool = Executors.newCachedThreadPool();
			while (true) {
				System.out.println("等待客户端连接。。。。。。");
				Socket socket = serverSocket.accept();
				System.out.println("客户端已连接!");
				
				//启动线程来完成针对该客户端的交互
				ClientHandler handler = new ClientHandler(socket);
//				new Thread(handler).start();
				threadPool.execute(handler);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		Server server = new Server();
		server.Start();
	}
}

/*
 * *线程体,用于并发处理不同客户端的交互
 */
class ClientHandler implements Runnable{
	private Socket socket;
	
	public ClientHandler(Socket socket) {
		this.socket = socket;
	}
	
	@Override
	public void run() {
		try {
			InputStream in = socket.getInputStream();
			InputStreamReader isr = new InputStreamReader(in);
			BufferedReader br = new BufferedReader(isr);
			while (true) {
				String clientContent = br.readLine();
				if(clientContent.contains(",")) {
					String[] clientArr = clientContent.split(",");
					System.out.println("客户端"+clientArr[0]+"说:"+clientArr[1]);
					System.out.println(Thread.currentThread().getName());
				}else {
					System.out.println("客户端说:"+br.readLine());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();	
		}finally {
			if (socket!=null) {
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	
}
public class Client {
	private Socket socket;
	//初始化
	public Client() {
		try {
			socket = new Socket("localhost",8081);	
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/*
	 * 客户端工作方法
	 */
	public void Start() {
		try {
			OutputStream out = socket.getOutputStream();
			OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");
			PrintWriter pw = new PrintWriter(osw,true);
			Scanner scanner = new Scanner(System.in);
			while (true) {
				pw.println("A,"+scanner.nextLine());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if(socket!=null) {
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
		}
	}
	
	public static void main(String[] args) {
		Client client = new Client();
		client.Start();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值