java网络编程:8、基于TCP的socket编程(一)简单的socket通信_一个客户端

  • Post author:
  • Post category:java



声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!!


文章目录


一、基于tcp的编程,就好像用电话进行交谈一样


二、在java中用于编程网络程序的类


三、套接字 + (输出、输入流)


1、服务器程序编写基本步骤:


2、客户端程序编写基本步骤:


四、代码编写


1、服务器端程序的编写


2、客户端程序的编写


3、打印输出


4、你这个sever和client都是在同一个程序当中编写的,


那么我如何在两台机器之间进行通信呢?


五、系列文章(java网络编程)


一、基于tcp的编程,就好像用电话进行交谈一样

基于tcp的编程,就好像用电话进行交谈一样,我们总是一个人在等待电话,另一个人去拨打电话,要想能够打通这个电话,在你拨电话号码的时候,这个人一定是已经在等待电话了,随时可以接电话。如果这个人不在电话旁边,你就无法完成这次通信,也就是说通信双方是不对等的。

等待接电话的一方,我们把它叫做服务器端,拨电话号码的这一方,我们把它叫做客户端。也就是在网络中等待连接请求到来的一方,为

服务器端

,发起连接请求的一方为

客户端

要进行通信,首先我们要创建套接字,套接字实际上是一个抽象的概念,在套接字编程模型中,套接字是作为通信链路的端点。

我们可以把套接字看成是电话机,有了套接字才有了通信的工具,我们可以把ip地址看成是电话号码,端口号看成是分机号。

二、在java中用于编程网络程序的类

在java中用于编程网络程序的类,是通过java.net这个包给我们提供的。里面的ServerSocket类是用来创建

服务器端的套接字

,Socket类用来创建

客户端的套接字


对于服务器端来说,

我们去调用ServerSocket(int port)这个构造方法,然后去创建一个服务器端的套接字,绑定到指定的端口上,然后去调用accept方法,这个方法它等待客户请求到来,然后返回一个套接字,用这个套接字去和我们的客户端进行通信,对于服务器端套接字来说,它不能直接用于数据的交换,我们可以把这个服务器端的套接字看成是一个监听套接字,它负责监听客户端请求,一旦有客户端请求到来,那么这个accept方法就接收客户端请求,然后返回一个用于数据通信的套接字。


对于客户端来说,

我可以调用Socket的构造方法Socket(InetAddress address,int port),然后指定ip地址、指定端口号,那么就可以建立一个到我们服务器端,指定端口的一个进程的连接。在java当中,ip地址是用InetAddress这个类来表示的,在这个类当中提供了很多有用的方法。

如:getByName(String host)静态方法,可通过主机名来获得对应的ip地址。

如果我们传递的本身就是ip地址的字符串格式,那么它会将我们的ip地址直接返回。

getLocalHost()静态方法,可返回我们本地的ip地址

三、套接字 + (输出、输入流)

接下来对于服务器端和客户端,那么我们就可以利用Socket里面的getOutputStream方法去获取一个输出流,用于发送数据,getInputStream方法去获取一个输入流,用于从网络上读取数据。同样的再客户端也可以这样获取输出流、输入流。

1、服务器程序编写基本步骤:

①调用ServerSocket(int port)创建一个服务器端套接字,并绑定到指定端口上;②调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。③调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。④最后关闭通信套接字。

2、客户端程序编写基本步骤:

①调用Socket()创建一个流套接字,并连接到服务器端;②调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。③最后关闭通信套接字。

四、代码编写

基于TCP的socket编程_简单的socket通信_一个客户端

1、服务器端程序的编写

/**
	 * 服务器端程序的编写
	 */
	public static void server() {
		try {
			// 创建服务器端套接字,绑定到6000的端口上
			ServerSocket ss = new ServerSocket(6000);
			// 调用accept方法就会阻塞,直到客户端有连接请求到来的时候。
			// 它会返回一个套接字,然后就可以利用这个套接字与客户端进行数据通信。
			Socket s = ss.accept();
			// 可以利用套接字获取输出流、输入流
			OutputStream os = s.getOutputStream();
			InputStream is = s.getInputStream();
			// 利用输出流向客户端发送数据
			// getBytes将字符串转换成字节数组
			os.write("Hello,welcome you,client!".getBytes());
			// 利用输入流从网络上读取数据
			// 建立字节数组
			byte[] buf = new byte[100];
			// 将数据读取到buf字节数组当中,它会返回实际读取的字节数
			int len = is.read(buf);
			// 将我们读取的数据打印出来
			System.out.println(new String(buf, 0, len));
			// 完成通信之后,我们可以将输出流、输入流、套接字、服务器端的套接字都关闭
			os.close();
			is.close();
			s.close();
			ss.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

2、客户端程序的编写

/**
	 * 客户端程序的编写
	 */
	public static void client() {
		try {
			// 创建一个客户端的套接字,指定一个ip地址和端口。
			// 让它连接到我们服务器端上,在这个端口上等待连接的服务器进程
			// ip地址:你可以指定主机名,或者指定ip地址,让它直接返回。
			// 我们在编写程序的时候,可能没有两台机器,没有关系,我们可以在一台机器上,
			// 让我们服务端程序和客户端程序,通过网络进行通信。
			// 那么我们可以获取本地的ip地址,它有三种方式:
			// InetAddress.getByName("localhost")
			// InetAddress.getByName("127.0.0.1")//是我们本地的回路地址
			// InetAddress.getByName(null)//它也可以返回本地的IP地址
			//那么这三种方式,即使这我们的机器上没有网卡,也没有关系。
			//那么作为一台pc机,它都会有一个"127.0.0.1"作为本地的一个回路地址,那么我们用这个地址,
			//就可以测试我们的网络程序。 
			//注:你在客户端发送连接请求的端口号,和服务器端等待连接的端口号一定要一致。
			//这就好像你打电话一样,那么我的分机号是6000,那么你打过来的时候你转这个分机号,你也要转6000
			//才能够和我进行通信,你不能说你随便转个分机号,你想转5000和我进行通信,那是不可能的。
			Socket s = new Socket(InetAddress.getByName("localhost"), 6000);
			// 可以利用套接字获取输出流、输入流
			OutputStream os = s.getOutputStream();
			InputStream is = s.getInputStream();
			//输入流向服务器端读取数据
			byte[] buf = new byte[100];
			int len = is.read(buf);
			System.out.println(new String(buf, 0, len));
			//输出流向服务器端发送数据
			os.write("Hello,this is zhangsan".getBytes());
			//完成通信之后,我们可以将输出流、输入流、套接字都关闭
			os.close();
			is.close();
			s.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}

	}


3、打印输出

打开两个Console

启动服务器端

启动客户端后,进行通信,如下图:

我们这个服务器程序只为一个客户进行了服务,当它为这个客户服务完成之后,那么它就退出了!

通常我们在开发一个服务器端程序的时候,那么我们是要为多个客户同时提供服务。

下面我们就采用多线程的技术来改造一下,我们的服务器端程序。

详见下篇文章:

java网络编程:9、基于TCP的socket编程(二)循环监听接收多个客户端_多线程服务器程序


4、你这个sever和client都是在同一个程序当中编写的,


那么我如何在两台机器之间进行通信呢?

// 你这个sever和client都是在同一个程序当中编写的,那么我如何在两台机器之间进行通信呢?

// 程序和进程是不同的概念,我们虽然在一个程序当中写了一个server和一个client,

// 但是我们在进行网络通信的的时候,是一个进程和另一个进程在进行通信,那么当我们运行server的时候,

// 它调用的是server这个方法,那么启动了一个进程,这个进程我们可以把它看作是服务器端进程,当我们调用

// client方法的时候,那么也启动了一个进程,我们可以把它看成是客户端进程。那么由这个服务器端进程和客户端

// 进程在进行通信。你要把这个程序放到两个机器上进行通信,很简单每一个机器上你拷贝一份代码就可以了。

// 服务器端运行sever方法,客户端运行client方法就可以了。

// 所以要理解我们在通信的时候,真正通信的是我们的进程。

五、系列文章(java网络编程)


java网络编程:1、计算机网络?网络通信的组成?什么是ip、协议、端口号?


java网络编程:2、IP地址、协议、网络状况、网络异质性问题的解决


java网络编程:3、ISO/OSI七层参考模型


java网络编程:4、OSI各层所使用的协议


java网络编程:5、数据封装


java网络编程:6、TCP/IP模型、TCP/IP模型与OSI参考模型的对应关系


java网络编程:7、端口、套接字(socket)的引入


java网络编程:8、基于TCP的socket编程(一)简单的socket通信_一个客户端


java网络编程:9、基于TCP的socket编程(二)服务器端循环监听接收多个客户端_多线程服务器程序


java网络编程:10、基于TCP的socket编程(三)缓冲流、flush方法、关闭流


java网络编程:11、基于UDP的socket编程(一)理论、基本步骤


java网络编程:12、基于UDP的socket编程(二)代码通信-简单实例


java网络编程:13、基于UDP的socket编程(三)实现相互发送接收消息



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