j2se--Socket沟通

简介:

   第一次接触Socket课程设计大二,我在做一个图书馆管理系统。源代码是从互联网上下载,代码天天磨,隐约中记得有Socket这么一个单词。

   第二次是去年代表学校參加“河北省电子信息职业技能大赛”,接受曹建新师哥的培训。建新师哥当时用手机Android软件做client。通过局域网向电脑端server传输手机录入的信息。当时我非常诧异,client是Android平台,server是.Net平台,这两种平台是怎样在局域网内进行通信的呢?建新师哥的回答是:“通过Socket。把数据打包成JSON格式进行传输。”从此对Socket的认识便有了一种高大上的感觉。

   第三次接触是通过马士兵老师的视频,这次瞬间感觉Socket--So Easy。这也验证了米老师的那句话:不怕不知道,就怕不知道

   Socket通信分为serverSocket即ServerSocket和clientSocket。

   在server端,通信前须要建立和client的通信通道,建立对client通信port号的监听;在client,通信前须要定义进行通信的主机IP和port号,创建通信通道。两者都准备完成,以下就能够进行通信了。

   server端代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {

	public static void main(String[] args) {
		//创建向client数据传输的通道
		InputStream in = null;
		//创建从client接收数据的通道
		OutputStream out = null;

		try {
			//建立和client的通信,并定义通信端口
			ServerSocket ss = new ServerSocket(5888);
			//监听client提交的请求
			Socket socket = ss.accept();
			in = socket.getInputStream();
			out = socket.getOutputStream();
			//在字节流的基础上进行包装数据流
			DataInputStream dis = new DataInputStream(in);
			DataOutputStream dos = new DataOutputStream(out);

			//接收client提交的请求
			String s = null;
			if ((s = dis.readUTF()) != null) {
				System.out.println(s);
				System.out.println("from:" + socket.getInetAddress());
				System.out.println("port:" + socket.getPort());
			}

			//向client数据传输
			dos.writeUTF("hi,hello");
			dos.close();
			dis.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
         因为数据流的readUTF()方法和writeUTF()方法都是堵塞式,所以当A向B发送数据后。假设B没有响应。A是无法继续发送数据的,仅仅能傻傻的等待。这个过程好比TCP/IP协议的三次握手,1:A呼叫B,“我是A。收到请回答?”;2:B回应A,“我是B,收到”;3:A继续说。“我想请你吃饭,你有时间吗?”。以下A和B就能够进行通信了。

   server端代码有了,以下分享client代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClient {
	public static void main(String[] args) {
		//创建向server数据传输的通道
		InputStream in = null;
		//创建从server接收数据的通道
		OutputStream out = null;
		try {
			//定义进行通信的主机IP和端口号
			Socket socket = new Socket("localhost", 5888);
			in = socket.getInputStream();
			out = socket.getOutputStream();
			//在字节流的基础上进行包装数据流
			DataInputStream dis = new DataInputStream(in);
			DataOutputStream dos = new DataOutputStream(out);
			//向server提交数据
			dos.writeUTF("hey");
			//接收从server返回的数据
			String s = null;
			if ((s = dis.readUTF()) != null) {
				System.out.println(s);
			}
			dos.close();
			dis.close();
			socket.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}
       通过这个简单的小Demo,我们就能够清晰的观察到Socket是怎样在server端和client进行通信的。

    J2SE是JavaWeb和J2EE的基础,异常处理、IO通道、线程、网络编程、GUI编程又是J2SE的基础,所以学好Socket非常有必要。

    席慕蓉说过一句名言:前世的五百次回眸才干换得今生的一次擦肩而过。所以对于以后的每次擦肩而过都应该认真对待。不要像我。和Socket都擦肩而过好多次了,今天才最终认识它。

版权声明:本文博客原创文章,博客,未经同意,不得转载。




本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4651495.html,如需转载请自行联系原作者


相关文章
|
存储 Java 程序员
Java SE的15道经典面试题
Java SE的15道经典面试题
289 0
|
机器学习/深度学习 人工智能 数据可视化
【好物分享】onnx-modifier:可视化操作助力模型更改,让你不再为更改模型烦恼!
【好物分享】onnx-modifier:可视化操作助力模型更改,让你不再为更改模型烦恼!
1951 0
【好物分享】onnx-modifier:可视化操作助力模型更改,让你不再为更改模型烦恼!
|
3月前
|
Linux
linux文件重命名命令
本指南介绍Linux文件重命名方法,包括单文件操作的`mv`命令和批量处理的`rename`命令。`mv`可简单更改文件名并保留扩展名,如`mv old_file.txt new_name.txt`;`rename`支持正则表达式,适用于复杂批量操作,如`rename 's/2023/2024/' *.log`。提供实用技巧如大小写转换、数字序列处理等,并提醒覆盖风险与版本差异,建议使用`-n`参数预览效果。
|
iOS开发
iOS开发UI之日期控件的使用(UIDatePicker)
iOS开发UI之日期控件的使用(UIDatePicker)
494 0
|
8月前
|
搜索推荐 数据挖掘 API
电商发展的强大助推器:淘宝API
淘宝API是阿里巴巴为开发者提供的访问淘宝开放平台(TOP)的接口,连接淘宝电商生态系统与外部应用。它支持商品管理、订单处理、用户信息和营销推广等功能,帮助开发者轻松获取商品信息、处理订单、管理会员和进行数据分析。通过淘宝API,电商企业能提高效率、降低成本、增加收入并优化用户体验。其应用广泛,涵盖电商平台建设、价格比较、市场研究及移动应用开发等领域。未来,淘宝API将融合人工智能、拓展生态合作并加强数据安全,持续推动电商行业发展。
585 34
|
XML Web App开发 Java
【软件测试】关于Web自动化测试
【软件测试】关于Web自动化测试
|
监控 数据可视化 Linux
使用Portainer图形化工具轻松管理远程Docker环境并实现远程访问
使用Portainer图形化工具轻松管理远程Docker环境并实现远程访问
|
分布式计算 Hadoop
Iceberg实战踩坑指南(二)
Iceberg实战踩坑指南
333 0
使用freemarker动态填充html并可转为图片
使用freemarker动态填充html并可转为图片
758 0
|
负载均衡 监控 网络协议
边界网关协议 - 段路由的链路状态 (BGP-LS) 扩展
段路由 (Segment Routing,SR) 允许通过将路径编码为称为“段”的拓扑子路径序列来灵活定义端到端路径。这些段由路由协议通告,例如 IGP 拓扑中的链路状态路由协议(IS-IS、OSPFv2 和 OSPFv3)。
2355 0
边界网关协议 - 段路由的链路状态 (BGP-LS) 扩展

热门文章

最新文章