示例代码:

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编程的更多相关文章

  1. Java网络编程学习A轮_01_目标与基础复习

    A. A轮目标 复习网络编程基础知识,重点学习下TCP三次握手四次挥手,以及可能引发的异常情况. 回顾 Socket 编程,好多年没写(chao)过相关代码了. 重学 NIO,以前学的基本忘光了,毕竟 ...

  2. Java网络编程学习A轮_06_NIO入门

    参考资料: 老外写的教程,很适合入门:http://tutorials.jenkov.com/java-nio/index.html 上面教程的译文:http://ifeve.com/overview ...

  3. Java网络编程学习A轮_08_NIO的Reactor模型

    参考资料: 了解 Java NIO 的 Reactor 模型,大神 Doug Lea 的 PPT Scalable IO in Java 必看:http://gee.cs.oswego.edu/dl/ ...

  4. Java网络编程学习A轮_07_基于Buffer的Socket编程

    示例代码: https://github.com/gordonklg/study,socket module A. LineSeparate 基于 Buffer 实现逐行读取的 EchoServer ...

  5. Java网络编程学习A轮_03_抓包分析TCP四次挥手

    参考资料: http://www.jellythink.com/archives/705 示例代码: https://github.com/gordonklg/study,socket module ...

  6. Java网络编程学习A轮_04_TCP连接异常

    参考资料: https://huoding.com/2016/01/19/488 示例代码: https://github.com/gordonklg/study,socket module A. C ...

  7. Java网络编程学习A轮_02_抓包分析TCP三次握手过程

    参考资料: https://huoding.com/2013/11/21/299 https://hpbn.co/building-blocks-of-tcp/#three-way-handshake ...

  8. (转)《深入理解java虚拟机》学习笔记10——并发编程(二)

    Java的并发编程是依赖虚拟机内存模型的三个特性实现的: (1).原子性(Atomicity): 原子性是指不可再分的最小操作指令,即单条机器指令,原子性操作任意时刻只能有一个线程,因此是线程安全的. ...

  9. 网络编程学习笔记:Socket编程

    文的主要内容如下: 1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect ...

随机推荐

  1. 微信小程序 --- 模板的使用

    由于微信小程序文件大小的限制,可以把一些公用的文件 单离出来形成模板,从而被各个模板引用: 定义模板第一种方式: 新建一个目录: 写入: <text>hello world</tex ...

  2. 从零打造在线网盘系统之SSH框架整合

    欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...

  3. Apache配置虚拟主机httpd-vhosts.conf

    一.配置虚拟主机需要3个文件  1.Apache/conf/httpd.conf 2.Apache/conf/extra/httpd-vhosts.conf (这个地版本的apache可能没有,可自己 ...

  4. codeforces#505--A Doggo Recoloring

    A. Doggo Recoloring time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. 由于dns服务为启动导致的GI集群启动故障

    1.物业由于突然断电导致grid集群重新启动后rac数据库无法正常启动,对集群进行检查,结果如下,发现其中有4个数据库状态为instance shutdown.[root@node1 ~]# su - ...

  6. ValueError: Only call `sparse_softmax_cross_entropy_with_logits` with named a

    第五章中完整的训练MNIST数据的神经网络模型的程序代码中,直接运行程序的话会遇到以下的错误. 把下面的这行代码 # 计算交叉熵及其平均值 cross_entropy = tf.nn.sparse_s ...

  7. Ensure Indexes Fit in RAM

    Ensure Indexes Fit in RAM — MongoDB Manual https://docs.mongodb.com/manual/tutorial/ensure-indexes-f ...

  8. Andrew Ng机器学习公开课笔记 -- Generalized Linear Models

    网易公开课,第4课 notes,http://cs229.stanford.edu/notes/cs229-notes1.pdf 前面介绍一个线性回归问题,符合高斯分布 一个分类问题,logstic回 ...

  9. [JS]1.Hello Word

    1.Hello Word <!DOCTYPE html> <html> <head> <title>Hello World!</title> ...

  10. java线程初写,陆续更新中。。

    (1)什么是线程?线程,是程序执行流的最小单元.线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享 ...