Java网络编程

相关概念:

  • IP地址
  • 端口
  • socket

理论
  • TCP

    区分服务端和客户端

    服务端:

    (1)创建ServerSocket对象,传入监听的端口号

    (2)等待客户端的连接,调用accept方法(若无客户端连接,程序会堵塞此处)

    (3)获取输入输出流进行操作

    (4)设置输出结束标记(socket.shutDownOutput(),或flush(),或字符流nextLine)

    (4)关闭流资源

    客户端:

    (1)创建Socket对象,传入要连接主机地址和端口号

    (2)获取输入输出流

    (3)设置输出结束标记

    (4)关闭流资源

  • UDP

    不区分服务端和客户端,发送目标主机和端口号信息存放在数据报 DatagramPacket 中

    (1)创建DatagramSocket对象,传入监听的端口号

    (2)创建数据报对象,用来接收信息

    (3)调用数据报套接字的 receive方法 接收信息

    (4)拆包获取信息

    (5)发送信息,对方信息封装在 数据报中

    (DatagramPacket datagramPacket1 = new DatagramPacket(bytes1,bytes1.length, InetAddress.getLocalHost(),7777);)

    (6)调用数据报的send方法发送

    (7)关闭数据报套接字


实践

服务器端:

    // 1. 在本机的 9999端口监听,等待连接
// 注意:
// (1)要求本机没有其他服务在监听9999,否则无法通过
// (2)当没有客户端连接时,程序会阻塞等待连接
ServerSocket severSocket = new ServerSocket(9999);
System.out.println("服务器正在监听9999端口..."); // 2.如果有客户端连接,则会返回Socket对象,程序继续
// 细节:这个 ServerSocket 可以通过accept() 返回多个Socket [多个客户端连接服务器的并发]
Socket socket = severSocket.accept();
System.out.println("socket = " + socket.getClass()); // 3.通过 socket.getInputStream() 读取
// 客户端写入到数据通道的数据,显示
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int length = 0;
while ((length = inputStream.read(bytes))!=-1){
System.out.println(new String(bytes,0,length));
}
inputStream.close();
socket.close();

客户端:

    //1. 连接服务器(ip,端口)
// 连接本机的 9999 端口,连接成功则返回一个Socket对象
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("客户端连接"); //2. 连接上后,生成Socket,通过socket.getOutputStream()
// 得到与该套接字对应的输出流
OutputStream outputStream = socket.getOutputStream(); //3. 通过输出流,写入数据到数据通道
outputStream.write("言语老是 不起作用".getBytes());
outputStream.close();
socket.close();

Java-net的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  3. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  4. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

  5. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  6. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  7. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  8. Java多线程基础学习(二)

    9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...

  9. Java多线程基础学习(一)

    1. 创建线程    1.1 通过构造函数:public Thread(Runnable target, String name){}  或:public Thread(Runnable target ...

  10. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

随机推荐

  1. 操作系统linux

    Linux命令概览 一.哪些地方可以学到Linux? 1.Linux中国 Linux中国绝对是学习Linux的好去处,各种资讯.文章.技术都有,而且更新及时,质量也很高,学Linux一定要去看啊. 2 ...

  2. 最长上升子序列 II 时间复杂度(nlogn)

    题目:最长上升子序列 II 给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少. 输入格式 第一行包含整数 N. 第二行包含 N个整数,表示完整序列. 输出格式 输出一个整数,表示 ...

  3. Spingboot 程序在linux 上发布

    1.Linux 安装JDK(略)参考之前的文章 2.创建springboot 程序 项目文件结构 注意 controller包要与Application 同一级 设置tomcat 端口 运行本机测试 ...

  4. 影片自由,丝滑流畅,Docker容器基于WebDav协议通过Alist挂载(百度网盘/阿里云盘)Python3.10接入

    使用过NAS(Network Attached Storage)的朋友都知道,它可以通过局域网将本地硬盘转换为局域网内的"网盘",简单理解就是搭建自己的"私有云" ...

  5. element ui el-date-picker 禁止选择指定日期

    1.日期选择器组件代码 <el-col :span="20"> <el-form-item label="活动起始日期值" prop=&quo ...

  6. 【Go语言基础】slice

    一.概述 数组(Array)的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本. 显然这种数据结构无法完全满足开发者的真实需求.Go语言提供了数组切片(slice)来弥补数组的不足. ...

  7. 【javascript】slice()、substring()和substr() 三种字符串截取方法区别

    slice(start, end) :slice(start, end) 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分.  1.start(包含) 和 end(不包含) 参数来指定字符串 ...

  8. Linux的终端(base),进入base环境

    正常界面,如下 带有(base) 一般是由于安装了conda环境管理软件,它自带一个base环境.第一次安装时出现这种情况可能是由于软件将启动base环境的命令写入-/.bashrc 文件,这就相当于 ...

  9. umi学习记录

    菜单路由: 方法1:在config中配置全部路由,由后台返的的菜单进行匹配 方法2:动态注册路由和添加菜单--目前仅尝试了umi@2 的版本 原理:使用umi的运行时配置patchRoutes和ren ...

  10. 微信小程序JS

    微信小程序之操作三元运算符class <view class="chejian wx:if='{{item.is_check == 1 ? 'hover' : ''}}' " ...