java实现网络的连接

什么是互联网

互联网是我们人类通过计算机设备来收发信息的桥梁,让我们机器之间可以互相通信。那么第一个问题就是,怎么将计算机之间连接在一起呢?数码相机刚出现的时候,我们用数码相机拍了一张照片,想把他打印出来,我们需要把照相机通过数据线连在电脑上,再将打印机也连在电脑上。通过数据线来将两台设备连接起来的。而我们想要将全世界都连接在一起,那么为每台设备之间都连一条数据线?那么一个台电脑上面要插无数的线,这是不可能实现的。所有我们需要有一个设备去连接多台电脑,然后控制设备间连接,我们将这种控制多个设备连接的叫做路由器,现实中的互联网也是由这些路由器连接起来的。互联网的概念已经不仅仅是两台电脑之间的连接,而是被扩展到希望将所有电子设备互联了。

互联网中设备是如何连接的

我们把电脑联到路由器上就可以互联了嘛?这是不行的,一个台计算机想向另一台计算机发送信息,首先要告诉路由器是哪台计算机。而路由器是怎么区分连进来的不同计算机呢,这里我们就要用到IP地址来唯一编号网络中的计算机了,让路由器知道这台计算机要发给哪一台计算机。当我们发送一个请求到路由器上想要跟某一台计算机连接,那么路由器首先要连接这两台电脑之间众多的路由器。一台计算机的信号发送到与这台计算机相邻的路由器上,然后再通过多台路由器来转发信号传递到与所要连接的那台电脑相连的路由器,最后由这台路由器发送信号到目标电脑。这样就为两台电脑通信之间搭建一条信息的连线。

电脑上是如何做的

当我们想要使用电脑中的某个程序去对另一台电脑传递一个信息的时候,我们要与那台电脑建立连接,这时候程序需要调用操作系统的Socket库来建立连接。网络连接几乎是每个现在软件中都会用到的一种方法,每台电脑中可以互联是因为我们规定了统一的网络连接规则,统一的网络发送规则。

如果没有一个统一的发送规则就相当于一个只懂中文的人与一个只懂英文的人去对话,因为语言规则的不同,他们将无法交流,或者传递的信息会出现理解上的错误。因为计算机的语言就是二进制的,这就使得我们能够为不同的计算机来制定统一的信息连接发送规则。只要规定连接的方式,一次发送的字节长度就可以机型通信了,这就是我们所说的TCP/IP协议。

因为都是制定好的统一规则,又是每个很多软件都通用的,所有我们就把网络传输的连接与发送写在操作系统中,需要用到的时候只需要调用操作系统中的Socket就可以了,由操作系统去统一的调用硬件网口的发送是最合理的了。这不仅减小了代码的冗余,不需要每个程序都去写代码去调用网口连接等协议规则,也保证了每个软件发送信息的安全性,不会被其它软件监听和干扰。
用java 代码去建立一个连接
现建立一个服务器,用来接受连进来的用户:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class serves {
	public void SetUpserber(int port) {
		try {
			//建立服务器
			ServerSocket  ss = new ServerSocket(port);
			//等待客户的连接
			Socket client = ss.accept();
			System.out.println("服务器连接");
			//当客户连接上来以后,我们建立输入和输出
			//InputStream 是输入流,用来接受用户传递过来的信息
			//OutputStream 是输出流,用来向用户发送信息
			java.io.InputStream input = client.getInputStream();
			java.io.OutputStream output = client.getOutputStream();
			//这里是传输的内容
			String s = "Hello World!";
			/*
			因为计算机通用的语言都是二进制的,所有我的传送的信息
			也应该是二进制的,这里就将字符串转换成二进制
			*/
			byte[] data = s.getBytes();
			//write方法就是将二进制的byte数组发送出去,也就是IO 字节流
			output.write(data);
			//read方法就是将二进制的byte数组读取出来
			int t = input.read();
			while(t != 's') {
				System.out.println(t+"服务器");
				t = input.read();
				
			}
			System.out.println("服务器关闭");
		ss.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public static void main(String[] args) {
		serves s = new serves();
		s.SetUpserber(9999);
	}
}

以同样的方法我们再写一个客户端,客户端与服务器不同的地方是,服务器需要给一个端口来让客户来连接,在电脑中同时会运行多个程序,而每个程序都需要连接网络,我们就用不同的端口号来分配给不同的程序。这样电脑就知道这个数据是属于哪个程序的了。建造服务器的时候我们需要指定一个端口号,然后客户连进来的时候,就跟操作系统说,我要找多少号端口号的程序。这样就可以将客服与服务器连接在一起了。而客户端除了需要知道程序再这个电脑中的端口位置,还需要知道这台电脑所在服务器的IP地址。所以Java服务器端代码如下。

import java.net.*;
import java.io.*;

public class client {
	public void conn2server() {
		try {
			Socket client = new Socket("127.0.0.1",9999);
			System.out.println("客户连接");
			
			InputStream input = client.getInputStream();
			OutputStream output = client.getOutputStream();
			
			System.out.println("向服务器输出");
			String msgString = "I am client";
			byte[] data = msgString.getBytes();
			System.out.println(data);
			
			System.out.println("打印务器信息");
			output.write(data);
			int t = input.read();
			System.out.print(t);
			try {
					Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
					e.printStackTrace();
			}
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	public static void main(String[] args) {
		client s = new client();
		s.conn2server();
		}
}

总结

两台服务器想要再网络中连接并且通信,首先要借助操作系统中的Socket库来建立连接传递和发送以及接收消息;接着要客户端需要知道服务器端的IP地址以及端口号才可以连接上;最后连接成功后就相当于两台电脑建立了一条道路,也就是这条通路上所用到的路由器连接等资源会被持续占用一直到通话结束,我们就可以将二进制的信息再这条道路上进行传输。当全部通讯结束后,至少一方断开连接了,那么这条占用的信息通道就会释放。想要下次连接,就需要重新建立连接。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值