转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51752701 文章出自:薛瑄的博客

你也可以查看我的其他同类文章,也会让你有一定的收货!

Socket简单例子

服务端:

public class Server {public static final int PORT = 12345;//监听的端口号public static void main(String[] args) {
//        System.out.println("服务器启动...\n");System.out.println("server start...\n");Server server = new Server();server.init();}public void init() {try {ServerSocket serverSocket = new ServerSocket(PORT);while (true) {// 一旦有堵塞, 则表示服务器与客户端获得了连接Socket client = serverSocket.accept();// 处理这次连接new HandlerThread(client);}} catch (Exception e) {System.out.println("服务器异常: " + e.getMessage());}}private class HandlerThread implements Runnable {private Socket socket;public HandlerThread(Socket client) {socket = client;new Thread(this).start();}public void run() {try {// 读取客户端数据DataInputStream input = new DataInputStream(socket.getInputStream());BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input));// 向客户端回复信息DataOutputStream out = new DataOutputStream(socket.getOutputStream());while (true) {
//                    String clientInputStr = input.readUTF();//这里要注意和客户端输出流的写方法对应,否则会抛 EOFExceptionString clientInputLine = bufferedReader.readLine();// 处理客户端数据
//                System.out.println("客户端发过来的内容:" + clientInputStr);
//                    System.out.println("response from client:" + clientInputStr);System.out.println("response from client:" + clientInputLine);//                System.out.print("请输入:\t");
//                    System.out.print("input:\t");
//                    // 发送键盘输入的一行
//                    String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
//                    out.writeUTF(s);}
//                out.close();
//                input.close();} catch (Exception e) {System.out.println("服务器 run 异常: " + e.getMessage());} finally {if (socket != null) {try {socket.close();} catch (Exception e) {socket = null;System.out.println("服务端 finally 异常:" + e.getMessage());}}}}}}

客户端:

public class Client {public static final String IP_ADDR = "localhost";//服务器地址public static final int PORT = 12345;//服务器端口号public static void main(String[] args) {System.out.println("start client...");
//      System.out.println("当接收到服务器端字符为 \"OK\" 的时候, 客户端将终止\n");System.out.println("stop client when received char is \"OK\" \n");Socket socket = null;try {//创建一个流套接字并将其连接到指定主机上的指定端口号socket = new Socket(IP_ADDR, PORT);//读取服务器端数据DataInputStream input = new DataInputStream(socket.getInputStream());//向服务器端发送数据DataOutputStream out = new DataOutputStream(socket.getOutputStream());while (true) {out.write("12123\n".getBytes());
//              System.out.print("请输入: \t");System.out.print("input: \t");String str = new BufferedReader(new InputStreamReader(System.in)).readLine();
//                out.writeUTF(str);out.write(str.getBytes());String ret = input.readUTF();
//                System.out.println("服务器端返回过来的是: " + ret);System.out.println("response from server : " + ret);// 如接收到 "OK" 则断开连接if ("OK".equals(ret)) {
//                    System.out.println("客户端将关闭连接");System.out.println("client will close");Thread.sleep(500);break;}}out.close();input.close();} catch (Exception e) {System.out.println("客户端异常:" + e.getMessage());} finally {if (socket != null) {try {socket.close();} catch (IOException e) {socket = null;System.out.println("客户端 finally 异常:" + e.getMessage());}}}}
}

read()

如果服务器已经断开socket连接,此时再客户端使用boolean b1 = mSocket.isConnected();还是会返回true,但是使用read()会一直返回-1

之所以会出现连接断开了,但是isConnected()还是会返回true,我认为是这样的,因为tcp连接只是一种状态,服务端和客户端保持这个状态,表示有数据到来,各自会接收,也可以向对方发送数据。其实世界上所有的可以上网的设备都已经存在了物理连接,只不过需要通过各自设备状态(比如:tcp的各个状态),来允许来和谁通信。

readLine()

BufferedReader的readLine方法是一次读一行的,这个方法是阻塞的,

直到它读到了一行数据为止程序才会继续往下执行

直到程序遇到了换行符或者是对应流的结束符readLine方法才会认为读到了一行,

才会结束其阻塞,让程序继续往下执行

所以在写入的时候字符串结尾用换行符就行了 bw.write(“你好服务器\n”);

readUTF()

readUTF读取的必须是writeUTF写下的字符串。

参考:

在Java中readUTF()怎莫用?
android socket readline()方法读不到值的问题
一个 Java 的 Socket 服务器和客户端通信的例子

关注我的公众号,轻松了解和学习更多技术

Java Socket简单例子、readLine()、readUTF()相关推荐

  1. 全网最全的Java Socket通讯例子

    一.前言 Socket通讯在银行.图书馆,物联网应用较多,日常都是Http/Https居多.网上关于Java的比较完整的Socket编程例子屈指可数,参考价值不大.要么是短连接且只支持纯文本通讯:要么 ...

  2. C# Socket简单例子(服务器与客户端通信)

    这个例子只是简单实现了如何使用 Socket 类实现面向连接的通信. 注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中的使用程序.在这个例子中,实际上还有很多问题没有解决,如消 ...

  3. Java序列化简单例子

    首先来看看要序列化的对象 Person.java package com.zjut.yunfeiyang; import java.io.Serializable; public class Pers ...

  4. java多态简单例子6_Java_6、面向对象——继承和多态

    继承 •继承是面向对象编程的三大特征之一,是一种基于已有类来创建新类的机制.由继承而得到的类称为子类(或派生类),被继承的类称为父类(或超类). •Java中每个类只允许有一个父类.语法如下:clas ...

  5. java c 简单例子_通过一个简单的例子来理解C语言中的LAPACK调用

    我是LAPACK和C / Fortran接口的初学者 . 我需要在Mac OS-X Lion上使用LAPACK / BLAS解决线性方程和特征值问题 . OS-X Lion提供优化的BLAS和LAPA ...

  6. java多态的简单例子_要JAVA的简单例子,继承\多态的,详细讲解运行的每一步

    java中的多态是动态绑定的,也就是说在编译期不能确定一个方法的执行体是哪个方法(在继承中重写的方法).执行果支委会根据在堆上分配的的引用去寻找方法体,所以产生你你所不想要的结果是正常的也是正确的.改 ...

  7. java 存储过程简单例子

    ---创建表 create table TESTTABLE (   id1  VARCHAR2(12),   name VARCHAR2(32) ) select t.id1,t.name from ...

  8. JAVA lambda 简单例子

    多了不说直接上代码 package com.example.demo; import java.util.ArrayList; import java.util.Arrays; import java ...

  9. Java Socket正确读取数据姿势

    前言 平时日常开发用得最多是Http通讯,接口调试也比较简单的,也有比较强大的框架支持(OkHttp). 个人平时用到socket通讯的地方是Android与外设通讯,Android与ssl服务通讯, ...

最新文章

  1. 微信公众号网页获取用户信息
  2. 树莓派小车python操作流程--龙邱科技
  3. Initial load DNL_CUST_PROD0 并找出SAP S4表和CRM表的mapping关系
  4. JQuery快速入门-选择器
  5. 走捷径拿到大厂25K高级测试Offer,别不服!
  6. linux下无权限安装anaconda和tensorflow-gpu
  7. JavaScript学习(八十五)—数据类型的转换
  8. 机器学习代码实战——拆分训练集与测试集(train_test_split)
  9. Spring与MyBatis整合源码分析
  10. i8一点通如何加载虚拟光驱玩游戏
  11. 安装fitz报错_Kylo单机安装详解
  12. 软件系统测试工作指南
  13. 捷径|抖音去水印教程
  14. 如何从chrome获取你需要的缓存视频
  15. c语言赋值语句逗号,C++中赋值运算符与逗号运算符的用法详解
  16. 运营方法论——增长黑客
  17. 基于Element UI Calendar实现日程提醒功能
  18. IDM下载器使用方法详解:百度网盘下载,视频会员一网打尽!
  19. python之bug0:selenium使用新版edge(chrome内核) 导致的webdriver.Edge 运行报错
  20. 概率论-4.3随机变量序列的两种收敛性(待补充)

热门文章

  1. 在Linux服务器上执行python定时任务(APScheduler定时框架)
  2. 怎么写一个ipad屏幕投屏到Windows的程序?
  3. 带你和Python与R一起玩转数据科学: 探索性数据分析
  4. MPU6050陀螺仪采集各个角度显示在OLED上
  5. 1024程序员日:还有这种操作,舒适!
  6. 如果你把这篇文章读透,可能你的人生从此会变得有一些不同
  7. 海鲜市集、五星级酒店…青岛这里要添一处新地标,震撼效果图曝光!
  8. java科学计数法转换为数字型字符串
  9. fiddler限制网速,自定义限制网速
  10. python 生成随机数