Java网络编程学习A轮_05_Socket编程
示例代码:
https://github.com/gordonklg/study,socket module
A. Socket 编程简单例子
最简单的 Socket 编程是通过回车/换行符,整行读取字符串。网上代码随便抄抄便是。
gordon.study.socket.basic.LineSeparateEchoServer.java
代码略
B. 简单的自定义协议
对于传输内容包含回车/换行符的通讯需求,可以使用自定义协议。
此处演示一个很简单的协议:
- 第一个字节代表类型,1表示为文本,0表示结束通讯,可扩展其它类型,如 jpeg、png、wav
- 第2-3个字节代表整个报文段长度
- 后面为消息内容
gordon.study.socket.basic.CustomProtocolPrintServer.java
public class CustomProtocolPrintServer {
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
for (int i = 0; i < 3; i++) {
new Thread(new CustomProtocolPrintClient()).start();
}
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
Socket socket = serverSocket.accept();
new Thread(new PrintServerHandler(socket)).start();
}
}
private static class PrintServerHandler implements Runnable {
private Socket socket;
public PrintServerHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
DataInputStream dis = new DataInputStream(socket.getInputStream());
while (true) {
int type = dis.read();
if (type == 0) {
break;
}
int length = (dis.readByte() & 0xFF) << 8 | dis.readByte() & 0xFF;
byte[] content = new byte[length - 3];
dis.readFully(content);
System.out.println("server received: " + new String(content));
}
dis.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
gordon.study.socket.basic.CustomProtocolPrintClient.java
public class CustomProtocolPrintClient implements Runnable {
private String[] msgArray = { "ni hao", "hello", "chi le ma?", "你瞅啥?", "hi dude" };
@Override
public void run() {
try (Socket socket = new Socket()) {
socket.connect(new InetSocketAddress(8888));
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
for (int i = 0; i < 3; i++) {
int pos = ThreadLocalRandom.current().nextInt(msgArray.length);
long sleepTime = ThreadLocalRandom.current().nextLong(1500) + 250;
sendMsg(msgArray[pos], dos);
Thread.sleep(sleepTime);
}
dos.writeByte(0);
dos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void sendMsg(String msg, DataOutputStream dos) throws Exception {
byte[] bytes = msg.getBytes();
int totalLength = 3 + bytes.length;
dos.writeByte(1);
dos.write((byte) (totalLength >> 8 & 0xFF));
dos.write((byte) (totalLength & 0xFF));
dos.write(bytes);
}
}
Java网络编程学习A轮_05_Socket编程的更多相关文章
- Java网络编程学习A轮_01_目标与基础复习
A. A轮目标 复习网络编程基础知识,重点学习下TCP三次握手四次挥手,以及可能引发的异常情况. 回顾 Socket 编程,好多年没写(chao)过相关代码了. 重学 NIO,以前学的基本忘光了,毕竟 ...
- Java网络编程学习A轮_06_NIO入门
参考资料: 老外写的教程,很适合入门:http://tutorials.jenkov.com/java-nio/index.html 上面教程的译文:http://ifeve.com/overview ...
- Java网络编程学习A轮_08_NIO的Reactor模型
参考资料: 了解 Java NIO 的 Reactor 模型,大神 Doug Lea 的 PPT Scalable IO in Java 必看:http://gee.cs.oswego.edu/dl/ ...
- Java网络编程学习A轮_07_基于Buffer的Socket编程
示例代码: https://github.com/gordonklg/study,socket module A. LineSeparate 基于 Buffer 实现逐行读取的 EchoServer ...
- Java网络编程学习A轮_03_抓包分析TCP四次挥手
参考资料: http://www.jellythink.com/archives/705 示例代码: https://github.com/gordonklg/study,socket module ...
- Java网络编程学习A轮_04_TCP连接异常
参考资料: https://huoding.com/2016/01/19/488 示例代码: https://github.com/gordonklg/study,socket module A. C ...
- Java网络编程学习A轮_02_抓包分析TCP三次握手过程
参考资料: https://huoding.com/2013/11/21/299 https://hpbn.co/building-blocks-of-tcp/#three-way-handshake ...
- (转)《深入理解java虚拟机》学习笔记10——并发编程(二)
Java的并发编程是依赖虚拟机内存模型的三个特性实现的: (1).原子性(Atomicity): 原子性是指不可再分的最小操作指令,即单条机器指令,原子性操作任意时刻只能有一个线程,因此是线程安全的. ...
- 网络编程学习笔记:Socket编程
文的主要内容如下: 1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect ...
随机推荐
- OneThink后台模型怎么玩?
OneThink 后台模型有个模型类型: 模型下——>设计——>表单显示分组(怎么玩?) 这个将会显示在:内——>发布文章内容的时候: 单选按钮: 内容模块显示: 枚举类型可以这样玩 ...
- square-and-multiply algorithm
https://en.wikipedia.org/wiki/Square-and-multiply_algorithm
- Find them, Catch them---poj1703(并查集)
题目链接:http://poj.org/problem?id=1703 可以认为n个人和m句话: 每句话包含A a b;D a b; 刚开始关系不确定: A a b 就是问ab 是否同类: D a b ...
- 爬虫之selenium使用
详细使用链接: 点击链接 selenium介绍: selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质 ...
- Elasticsearch入门教程
ElasticSearch是一个高度可扩展的开源搜索引擎并使用REST API,所以您值得拥有. 在本教程中,将介绍开始使用ElasticSearch的一些主要概念. 下载并运行ElasticSear ...
- Spark Core (一) 什么是RDD的Transformation和Action以及Dependency(转载)
1. Spark的RDD RDD(Resilient Distributed Datasets),弹性分布式数据集,是对分布式数据集的一种抽象. RDD所具备5个主要特性: 一组分区列表 计算每一个数 ...
- React package.json详解
概述: 每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据).npm install命令根据这个配置文件 ...
- PAT 1083 List Grades[简单]
1083 List Grades (25 分) Given a list of N student records with name, ID and grade. You are supposed ...
- Java打包可执行jar包 包含外部文件
外部文件在程序中设置成相对当前工程路径,执行jar包时,将外部文件放在和jar包平级的目录. public class Main { 3 public static void main(String[ ...
- (转)在 ListViewItem 上拖动进行框选
public partial class Form1 : Form { private bool IsMouseDown = false; Rectangle MouseRect = Rectangl ...