示例代码:

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

  1. public class CustomProtocolPrintServer {
  2. @SuppressWarnings("resource")
  3. public static void main(String[] args) throws Exception {
  4. for (int i = 0; i < 3; i++) {
  5. new Thread(new CustomProtocolPrintClient()).start();
  6. }
  7. ServerSocket serverSocket = new ServerSocket(8888);
  8. while (true) {
  9. Socket socket = serverSocket.accept();
  10. new Thread(new PrintServerHandler(socket)).start();
  11. }
  12. }
  13. private static class PrintServerHandler implements Runnable {
  14. private Socket socket;
  15. public PrintServerHandler(Socket socket) {
  16. this.socket = socket;
  17. }
  18. @Override
  19. public void run() {
  20. try {
  21. DataInputStream dis = new DataInputStream(socket.getInputStream());
  22. while (true) {
  23. int type = dis.read();
  24. if (type == 0) {
  25. break;
  26. }
  27. int length = (dis.readByte() & 0xFF) << 8 | dis.readByte() & 0xFF;
  28. byte[] content = new byte[length - 3];
  29. dis.readFully(content);
  30. System.out.println("server received: " + new String(content));
  31. }
  32. dis.close();
  33. socket.close();
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. }
  39. }

gordon.study.socket.basic.CustomProtocolPrintClient.java

  1. public class CustomProtocolPrintClient implements Runnable {
  2. private String[] msgArray = { "ni hao", "hello", "chi le ma?", "你瞅啥?", "hi dude" };
  3. @Override
  4. public void run() {
  5. try (Socket socket = new Socket()) {
  6. socket.connect(new InetSocketAddress(8888));
  7. DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
  8. for (int i = 0; i < 3; i++) {
  9. int pos = ThreadLocalRandom.current().nextInt(msgArray.length);
  10. long sleepTime = ThreadLocalRandom.current().nextLong(1500) + 250;
  11. sendMsg(msgArray[pos], dos);
  12. Thread.sleep(sleepTime);
  13. }
  14. dos.writeByte(0);
  15. dos.close();
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. private void sendMsg(String msg, DataOutputStream dos) throws Exception {
  21. byte[] bytes = msg.getBytes();
  22. int totalLength = 3 + bytes.length;
  23. dos.writeByte(1);
  24. dos.write((byte) (totalLength >> 8 & 0xFF));
  25. dos.write((byte) (totalLength & 0xFF));
  26. dos.write(bytes);
  27. }
  28. }

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. C++中堆和栈的完全解析

    C++中堆和栈的完全解析 内存分配方面: 堆: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并 ...

  2. Composer 添加 Laravel-china 的国内源

    不知道由于什么原因,原来的 Composer 的国内镜像 https://pkg.phpcomposer.com/ 不能正常使用,经常连不上. 找了半天,发现还有一个 laravel-china 的国 ...

  3. jquery 获取对象

    jquery 获取对象 1.引用this作为对象时,必须以$(this)的形式变为对象目标,否则,无法识别,会报错“ has no method”

  4. const V.S readonly

    先上两个例子: ; ; static void Main(string[] args) { Console.WriteLine("A is {0},B is {1}", A, B) ...

  5. 设置UCHome注册登陆退出的跳转页自定义

    UCHome 默认注册.登录成功后跳转到 http://www.xxx.com/home/space.php?do=home 退出后会跳转到站点的首页,即 http://www.xxx.com/hom ...

  6. java爬取网页内容 简单例子(2)——附jsoup的select用法详解

    [背景] 在上一篇博文java爬取网页内容 简单例子(1)——使用正则表达式 里面,介绍了如何使用正则表达式去解析网页的内容,虽然该正则表达式比较通用,但繁琐,代码量多,现实中想要想出一条简单的正则表 ...

  7. 005-线程sleep、join、yield、wait、notify、notifyAll、run、start、synchronized

    一.线程sleep join yield wait 1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchroni ...

  8. 【译】Using Objects to Organize Your Code

    耗了一个晚上吐血翻译不过也学到了不少...<使用对象来组织你的代码>,翻译中发现原作者在原文中有部分代码有误或不全,本文已修改和添加~ 丽贝卡·墨菲原文链接:http://rmurphey ...

  9. hdu 5185 动态规划 分析降低复杂度

    这题说的是 x[1]+x[2]+x[3]+…+x[n]=n, 这里 0 <= x[i] <= n && 1 <= i <= n x[i] <= x[i+1 ...

  10. Redis 资料整理

    Redis is an open source, BSD licensed, advanced key-value store. Redis is often referred to as a dat ...