示例代码:

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. DGbroker故障切换示例

    1.主库故障 SQL> startup ORACLE instance started. Total System Global Area bytes Fixed Size bytes Vari ...

  2. R测试向量是否相等

    > x<-1:3 > typeof(x) [1] "integer" > y<-c(1,3,4) > typeof(y) [1] "d ...

  3. couldn't connect to host

    “couldn't connect to host” 这样的错误可能是主机不可到达,或者端口不可到达. ping OK只代表主机可以到达. 端口不可到达可能是由于HTTP 服务器未启动或者监听在其他端 ...

  4. instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例 , 返回true或者false

    <?phpclass MyClass{} class NotMyClass{}$a = new MyClass; var_dump($a instanceof MyClass);var_dump ...

  5. Linux服务器报错too many open files错误解决方案

    1.本质解决方案按照oracle的安装脚本中以下几项文件进行相应配置: cp /etc/security/limits.conf /etc/security/limits.conf.bak echo ...

  6. wireshark, loopback

    swapondd if=/dev/zero of=/data/mnt/swap bs=1024 count=8024000 sudo apt-get install wireshark sudo gr ...

  7. Web开发:URL编码与解码(转)

    原文:http://www.cnblogs.com/greatverve/archive/2011/12/12/URL-Encoding-Decoding.html 通常如果一样东西需要编码,说明这样 ...

  8. Flask系列之源码分析(二)

    应用技术点 python之__setattr__ python之threading.local python之偏函数 flask源码上下文管理 1.综述过程 将请求对象压入栈 1.请求进入 __cal ...

  9. mysql性能测试-tpcc

    mysql性能测试-tpcc Tpcc-mysql TPC-C是专门针对联机交易处理系统(OLTP系统)的规范 Tpcc-mysql由percona根据规范实现 TPCC流程  更能模拟线上业务   ...

  10. 浏览器输入url的全过程

    ########################################################################### ######################## ...