Socket网络连接小白教程


前言

用java实现一个简易的服务器和客户机


一、网络连接是什么?

你的电脑登录qq时,输入密码、账号。电脑通过网线把密码、账号发给腾讯的服务器。腾讯服务器确认密码正确,再通过网线发送登录成功的信号。这个信号就是网线中传输的电流(光)。

类比人和人说话交流,空气就是那根网线,声音——就是网线中的电流——在空气中传播。

信号在网线中传输时,不管是电流还是光,只有两种状态,通和不通。这刚好与计算机中的0和1对应起来(真是个奇妙的巧合)。
在网络传输中,最小的信息单位是byte,也就是8位。

二、如何创建一个网络连接?

1.服务器

创建一个能用的服务器只需要两行代码!

//服务器创建
java.net.ServerSocket myss = new java.net.ServerSocket(port);
// 等待客户机连接
java.net.Socket client = myss.accept();

myss就是我们的服务器
运行my.accept();进程就会停在那里,直到有客户机联进来,就返回一个Socket对象(client),里面封装了和客户机通讯的网络传输方法。这个client就相当于一个网络传输代码块,所有网络传输需要的代码都可以在里面调用;
//如有需要也可以自己写一个Socket类。
这里展示Socket封装的其中一些方法。调用这些方法就能传输任何你想传的东西。
在这里插入图片描述
你可能会问,一个Socket就封装了这么多方法,哪里只要两行代码呢。
不妨看下面的操作

//获取网络输入流
java.io.InputStream ins=client.getInputStream();
int t=ins.read();
	while(t!=666){
		System.out.println("读到的是 "+t);
		t=ins.read();
	} 

是不是,这些都是文件存储的代码,移植到网络通讯里,其实学通讯,相当于重学文件读写。真正要新学的代码只有两行。
上面这几行代码,会一直读取客户机传过来的字节,直到读到一个666,才停下。
与文件读写相似,上面的代码要不报错,也需要加上try{}chcatch (Exception e) {}

2.客户机

没有客户机连进去,服务器等于白搭。
这就写个客户机:
在while循环里不停给服务器发送"efewfe"。

    java.net.Socket client=new java.net.Socket("182.96.241.245",9999);
    //182.96.241.245是服务器电脑的IP地址;9999是服务器那个程序的接口。如果是用自己电脑,就把ip改成127.0.0.1
    java.io.OutputStream ous=client.getOutputStream();
    while(true){
		String msgString="efewfe";
		//获得字符串byte[]
		byte[] data=msgString.getBytes();
		//发送byte[]
		ous.write(data);
		//发给服务器了
	}

因为不能直接发字符串,所以要先转成byte[]再发送。
这里还有一个问题,再这个示例中客户机写入的是字符,而服务器读取的是int,这就造成了信息传输的错误。所以客户机和服务器一定要商量好要传什么,怎么传。于是,就产生了网络传输协议。

三、什么是协议?

第二个部分说了一定要商量好怎么传才能传有用的信息。也就是协议。
比如我要发一条直线,就先写一个byte 33,再写4个int代表坐标。
客户机读取到一个byte为33后,就知道是传直线了,接下来收四个坐标。
就完成一次直线传输了。

//客户机发直线的方法
public void sendPaint(int x1, int y1, int x2, int y2) {
		try {
			dous.writeByte(33);//直线为1
			dous.writeInt(x1);
			dous.writeInt(y1);
			dous.writeInt(x2);
			dous.writeInt(y2);
			System.out.println("发送一条直线");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

//服务器判断是否传的是直线
while (true) {
		int x = dins.readByte();
		/*
		 * 直线为1 
		 */
		if (x == 1){
			recevPaint(dins);
		}else{
			 System.out.println("乱传");
		}
	}
//收直线的方法
public void recevPaint(DataInputStream dins) {
		try {
			int x1 = dins.readInt();
			int y1 = dins.readInt();
			int x2 = dins.readInt();
			int y2 = dins.readInt();
			System.out.println("收到一条直线");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

这个先传的byte33,就是报头,代表直线,代表它后面有4个int。
同理,可以加个传圆形的,客户机传圆之前先传个byte33,只要报头是32,服务器就调用收圆坐标的方法。

而TPC/IP协议就是电脑之间传输信息的广泛通用的协议。也可以看成一个协议簇,因为它包含了许多不同的协议。有了这个协议,电脑之间传输信息就不会乱码了。

这里我的另一篇博客利用自定义协议写了一个网络视频画板
https://blog.csdn.net/m0_52237654/article/details/113444618


# 总结 其实网络传输最重要的是协议,有了协议啥都可以传
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值