《Java从入门到放弃》JavaSE入门篇:网络编程(入门版)

要进行网络编程,首先要搞清楚目的是什么。

网络编程说简单点就是在网络上的计算机进行数据的交互。

既然要进行数据交互,那就需要有一个发送方和一个接受方。

按网络上的说法,就是一个攻一个受·

当然,现阶段网上的电脑一般来说都是既接受数据,也能发送数据的,所以说这些电脑都是“插座型”的,进可攻,退可受!!!

好吧,还是使用专业点的名字吧:客户端/服务器

那么具体到两台电脑,它们是如何来交互数据的呢?请看下图:


从步骤来分析:

一、服务器端程序

    1.1创建一个服务器套接字(ServerSocket),并绑定到指定端口。

    1.2侦听来自客户端的请求,如果接受到连接则返回套接字对象(socket)。

    1.3获得输入/输出流,也就是进行数据的接收或发送。

    1.4关闭套接字(socket)。

二、客户端程序

    2.1创建一个套接字,向服务器指定商品发送请求。

    2.2与服务器正确连接后开始数据的接收或发送。

    2.3关闭套接字。

步骤分析完了,接下来就是实施了。

服务器端代码如下:

public class MyServer {
	private static final int SERVER_PORT = 9527; // 指定侦听端口

	public MyServer() {
		try {
			ServerSocket ss = new ServerSocket(SERVER_PORT); // 创建服务器套接字
			System.out.println("服务端已启动,正在等待客户端...");
			Socket s = ss.accept(); // 侦听来自客户端的请求
			InputStream in = s.getInputStream(); // 获得输入流,用来接收数据
			OutputStream out = s.getOutputStream(); // 获得输出流,用来发送数据
			byte[] buf = new byte[1024]; // 数据缓存
			int len = in.read(buf); // 从输入流中读取数据
			String strFromClient = new String(buf, 0, len);
			System.out.print("来自客户端的信息>>");
			System.out.println(strFromClient);
			String strToClient = "我也很好!";
			out.write(strToClient.getBytes()); // 往输出流中发送数据
			// 关闭输入流和输出流
			in.close();
			out.close();
			// 关闭通信套接字和服务器套接字
			s.close();
			ss.close();
			System.out.println("服务端已关闭。");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		MyServer ms = new MyServer();
	}
}

客户端代码如下:

public class MyClient {
	private static final int SERVER_PORT = 9527;  //服务器的侦听端口
	public MyClient() {
		try {  
			//由于服务端也是运行在本机,所以创建本机的InetAddress对象
			InetAddress address = InetAddress.getByName("localhost");
			Socket s = new Socket(address, SERVER_PORT);  //向服务器侦听端口发出请求
			System.out.println("客户端已启动。");
			InputStream in = s.getInputStream();     //获得输入流,用来接收数据
			OutputStream out = s.getOutputStream();  //获得输出流,用来发送数据
			String strToServer = "你好!";
			out.write(strToServer.getBytes());   //往输出流中发送数据
			byte[] buf = new byte[1024];
			int len = in.read(buf);              //从输入流中读取数据
			String strFromServer = new String(buf, 0, len);	
			System.out.print("来自服务端的回答>>");
			System.out.println(strFromServer);
			in.close();out.close();  //关闭输入流和输出流
			s.close();               //关闭通信套接字
			System.out.println("客户端已关闭。");
		} catch (UnknownHostException nhe) {
			System.out.println("未找到指定主机...");
		} catch (IOException ioe) { 
	    	ioe.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		MyClient mc = new MyClient();
	}
}

先运行服务器端

再运行客户端,可以发现服务器端的内容发生了变化

再切换到客户端的输出窗口

客户端的输出内容如下:

有兴趣的看官可以修改代码,让它变成可以从控制台反复输入文字来交互。研究得更深些的朋友,可以尝试发送文件。

网络编程最基本的内容到这儿就结束了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cloudskyme

JBPM4.4(1)-简单工程的搭建

源码下载 https://anonsvn.jboss.org/repos/jbpm/jbpm4/ JBPM是什么? jBPM是一个可扩展、灵活的流程引擎, 它可...

2705
来自专栏IMWeb前端团队

RESTful API 规范 v1.0

本文作者:IMWeb 梁伟盛 原文出处:IMWeb社区 未经同意,禁止转载 RESTful API 规范 v1.0 [toc] URI URI规范 不...

2527
来自专栏架构师之路

一分钟实现分布式锁

一、缘起 分布式环境下,多台机器上多个进程对一个数据进行操作,如果不做互斥,就有可能出现“余额扣成负数”,或者“商品超卖”的情况,如何实现简易分布式锁,对分布式...

4016
来自专栏木木玲

Netty in Action ——— ChannelHandler 和 ChannelPipeline

1923
来自专栏Kevin-ZhangCG

[ Java面试题 ]JavaWeb篇

2668
来自专栏JackeyGao的博客

终端操作(SHELL)技巧

本篇是一些小但是有用的终端操作技巧和一些快捷方式,可以让你在 linux 命令行有出奇的效率。一方面这些技巧可以让你的效率有所提高, 但有时候也会有隐患, 所以...

940
来自专栏佳爷的后花媛

php基础(一)

static 是静态变量,在局部函数中存在且只初始化一次,使用过后再次使用会使用上次执行的结果; 作为计数,程序内部缓存,单例模式中都有用到。

1742
来自专栏fixzd

redis系列:基于redis的分布式锁

这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁。会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁。

902
来自专栏Kevin-ZhangCG

[ Java面试题 ] 框架篇

  1. struts是一个按MVC模式设计的Web层框架,其实它就是一个Servlet,这个Servlet名为ActionServlet,或是ActionSe...

1482
来自专栏人人都是极客

Linux 程序编译过程的来龙去脉

大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解...

1583

扫码关注云+社区