基于TCP协议实现简单的通信

TCP协议:全称为传输控制协议(即对数据的传输进行一定的控制)。是一种需要建立连接的协议,同时也要基于输入输出流来传输数据。

在实现程序前要明白什么是IP? 什么是端口?

IP

在互联网中,一个IP地址作为唯一标识一个网络接口。是一段网络编码(二进制),32位数。一台连入互联网的计算机肯定有一个IP地址。也可能有多个。

端口

在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,集线器、交换机、路由器用于连接其他网络设备的接口等等。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口等等。

明白了TCP协议的大致de应用,下面来进行程序的实现。

程序实现:先创建两个不同的类:一个为服务器端,一个为客户端

服务器

我们知道TCP传输数据时需要建立而这之间的连接。这里就需要运用到,Socket,Socket是一个抽象概念,一个应用程序通过一个Socket来建立远程连接,Socket内部在通过tcp/ip协议将数据传输到指定位置。而在服务器就需要对指定端口进行监听,来看是否有信息接入,serversocket就是对此功能的实现.

ServerSocket mainsocket = new ServerSocket(8848);

如果接通成功,我们就会使用一个无限循环来处理客户端的连接,accept方法表示每有客户端接入,就返回一个socket实例于接入的客户端通信,如果没有客户端接入就会一直进入等待状态.

	while (true) {
				Socket clint = mainsocket.accept();

				InetAddress name = clint.getInetAddress();

				System.out.println("客户端"+name.getHostAddress()+"开始接受>>>>");
				//接受来自客户端的消息>>>
			
					}
				}

客户端:

相比于服务器客户端的程序要简单许多,同样的需要用socket建立连接,

Socket clint = new Socket("192.168.254.168",8848);

数据的传输:

无论是服务器,客户端都是要依赖于输入输出流进行数据的传输,所以在写入数据时要调用flush()方法.

// 用于读取网络数据:
InputStream in = sock.getInputStream();

// 用于写入网络数据:
OutputStream out = sock.getOutputStream();

 下面来看完整的代码实现:

服务器:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class damao1 {
	public static void main(String[] args) throws IOException {
		//
		Scanner input  = new Scanner(System.in);
		
		try(ServerSocket mains = new ServerSocket(8848);) {
			while (true) {
				//客户连接
				Socket clint = mains.accept();
				
				try(BufferedReader reader = new BufferedReader(new InputStreamReader(clint.getInputStream()));
						BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(clint.getOutputStream()))){
				
				//获取客户端的消息
				String gets = reader.readLine();

				if (!gets.equals(null)) {
					System.out.println("来自客户端消息:"+gets);
				}
				//发送数据到客户端
				String out = input.nextLine();
				writer.write(out);
				}		
			}
		}catch (Exception e) {
		}
	} 
}

客户端:

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class damao {
	public static void main(String[] args) {
		//
		Scanner input = new Scanner(System.in);
		
		while(true) {
			//创建socket对象连接服务器
		try (Socket clint = new Socket("192.168.43.71",8848);
				BufferedWriter write = new BufferedWriter(new OutputStreamWriter(clint.getOutputStream()));
					BufferedReader reader = new BufferedReader(new InputStreamReader(clint.getInputStream()))){
			//获取控制台输入的问题
			System.out.print("客户端要发送的消息:");
			String question = input.nextLine();
			
			//发送消息到服务器
			write.write(question);
			write.flush();
			
			//输出暂停
			clint.shutdownOutput();
			
			//获取服务器消息
			 String answer = reader.readLine();
			 System.out.println("服务器的回答:"+answer);
			
		} catch (Exception e) {
			}
		}
	}
}

接下来我们看下运行效果

 到此,程序完美运行.


版权声明:本文为m0_66944273原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。