相信直接编写简单的Socket客户端和Socketserver服务端很多人都会写,并且发现代码没什么错误,只是自己不知道运行出错原因在哪里。这里我就总的把我遇到的问题说一下,大神请过,像我一样的渣渣可以借鉴。

我是打算编写一个简单的程序实现客户端输入字符串服务器实现逆转后返回到客户端输出。首先看下图CS之间的交互原理。两边都需要都输入输出双向监听,并且相对应的,简单的说就是客户端输出,那么服务端就要输入。。。

但总是会出现如“Socket: Connection refused: connect”还有Software caused connection abort: recv failed等情况,因为问题出现的原因很多我这里就分析我出现的原因。

1.“Socket: Connection refused: connect”:原因就是你的服务端还没有启动你就启动客户端,或者是你修改过服务端端口号你没有再次启动服务端就直接就启动客户端来连接了,再者由于两边的端口号不一致这些原因都会导致。

2.Software caused connection abort: recv failed:使用8080端口时,一般不建议使用80还有一些特殊端口,

3.还有对于度娘有的说的通过inputstream的available()方法来判断,是否有响应结果.
如果available()的返回值为0,说明没有响应数据,可能是对方已经断开连接,
如果available()的返回值大于0,说明有响应数据.如果在我没有测试错误的情况下这里我个人测试并不是这样,而是相反的。

4.Address already in use: JVM_Bind如果端口号已经被使用时就会出现这种情况,如果连续很多端口都这样说明修改使用过的端口太多,dos下面运行netstat -anol来关闭掉一些进程端口就ok。或者重新启动服务端再来启动客户端。

4.看下面代码分析吧

服务端代码:

package page5;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;public class Server {public static void main(String[] args) throws UnknownHostException {Socket socket = null;ServerSocket serverSocket=null;try {while(true){serverSocket= new ServerSocket(8081);//创建绑定端口8000的对象ServerSocketSystem.out.println("服务器已经启动");socket = serverSocket.accept();//接收客户端请求,得到SocketSystem.out.println("有客户端连接过来了");BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//创建带缓冲的字符读入流String sr = br.readLine();//读取一个文本行PrintStream ps = new  PrintStream(socket.getOutputStream());//此输出流不会抛出异常ps.println(new StringBuffer(sr).reverse());//将反转后的字符串打印到客户端屏幕上 }} catch (IOException e) {e.printStackTrace();}finally{try {if(socket != null)socket.close();if(serverSocket != null)serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}}

客户端代码

package page5;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args){Socket socket = null;try {socket = new Socket("localhost",8081);//创建Socket, 请求服务端System.out.println("客户端已经连接上");while(true){BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintStream ps = new PrintStream(socket.getOutputStream());Scanner scanner = new Scanner(System.in);   // 创建ScannerSystem.out.println("请输入一个字符串6:");    // 给出提示输入String line = scanner.nextLine();     // 从键盘输入读取一行ps.println(line);//发送到服务端ps.flush();if((socket.getInputStream().available())==0)System.out.println(br.readLine());// 读取服务端发回的字符串, 打印  }} catch (Exception e){e.printStackTrace();}finally{if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}

1.启动服务端控制台输出

可以发现运行到socket = serverSocket.accept();这里是就开始阻塞,并没有运行输出下一句               System.out.println("有客户端连接过来了");

而我们启动客户端控制台输出

这是我们点击下图这里来查看之前的服务端程序

发现如下图这时候说明客户端服务端已经连接上了

再返回客户端输入字符串,让服务端把字符串变为逆转后返回,我们再点击上图位置查看客户端发现下图,成功转化。

同样我们可以测试上面说的available()返回值问题改为大于0时没有输出,API文档里说,这个方法不保证返回数据的准确性,最后用Common-IO包的IOUtils.copyLarge这个方法解决了。

如果使用的是本地连接时不需要启动服务器,这里与服务器没有关系。

Socket编程,自己电脑做服务端和客户端相关推荐

  1. Netty的Socket编程详解-搭建服务端与客户端并进行数据传输

    场景 Netty在IDEA中搭建HelloWorld服务端并对Netty执行流程与重要组件进行介绍: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...

  2. java sslsocket程序_JAVA与C++进行sslsocket通信,JAVA做服务端或客户端

    前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈. 本文测试环境: 系统:WINDOWS 7(第3.6步).OS X 10.9(第4步) 软 ...

  3. c# WINFORM SOCKET编程-简单聊天程序(服务端)

    初学C#的SOCKET编程,照着网上的代码写下来,程序总是有问题,经过自己长时间的调试,完成程序,以下是原码,有需要可以参考一下,还不完善,欢迎大家批评指正.(这里的代码没更新,附件重新上传更新,在另 ...

  4. Socket编程实践(6) --TCP服务端注意事项

    僵尸进程处理 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程 sign ...

  5. socket文件传输服务器,Socket文件传输(含服务端以及客户端源码)

    Socket文件传输 [实例简介] 传输任意格式文件 [实例截图] [核心代码] using System; using System.Collections.Generic; using Syste ...

  6. OSI七层、TCP/IP五层、UDP、TCP的socket编程(服务端及客户端)、字节序转换、多进程以及多线程服务端的实现

    1.网络以覆盖范围划分:局域网/城域网/广域网   互联网/因特网   以太网/令牌环网--组网方式 2.在网络中必须能够为一表示每一台主机,才能实现点到点的精确通信            IP地址: ...

  7. 多线程+SOCKET编程实现qq群聊的服务端和客户端

    多线程+SOCKET编程实现qq群聊的服务端和客户端 标签(空格分隔): 多线程 网络编程 线程同步 一.设计思路 1.服务端 每来一个客户端连接,服务端起一个线程维护: 将收到的消息转发给所有的客户 ...

  8. C++socket编程(三):3.6 服务端recv客户端发送的数据

    服务端中获取客户端发送过来的数据一定是关闭套接字之前进行,close之后就收不到数据了. 一般读取数据一般用read,windows上一般用recv(本质上也是read),但是为了跨平台,所以一般用r ...

  9. windows Socket编程之TCP服务端与客户端

    在前面的文章中有一篇讲到了命名管道通信,它是创建一根管道来进行进程之间或网络之间通信的.但是它有些缺陷,比如说效率较低等.而从这篇文章开始将介绍socket编程.socket是通过TCP,UDP,IP ...

最新文章

  1. python基础---模块与包
  2. 你相亲成功的几率有多高?机器学习硬核预测
  3. Gartner预测:芯片短缺,十大汽车主机厂未来一半都将自主设计芯片
  4. anaconda虚拟环境设置
  5. [翻译] SoundManager 音频管理器
  6. IDEA - 解决“idea 环境:junit:4.11 测试 mybatis 代码,无法导入 org.junit.Test 包”问题
  7. Java动态规划---矩阵链相乘的最小计算代价
  8. 窗口电压比较器电路设计
  9. CodeMeter***大赛战况:百人参赛,无人摘金!
  10. 行驶证OCR识别,信息提取
  11. MATLAB地图工具箱学习总结(一)从地图投影说起
  12. python 基于卡方值分箱算法
  13. vue 批量下载图片并打包成压缩包
  14. 合并pd.merge()含有相同的某一列两个不同的dataframe表格
  15. java怎么给文本框加滚动条_懂Java中Swing的朋友,谁能帮我在Jtextare上加一个滚动条啊?很急!...
  16. 【windows8开发】开发平台与开发框架
  17. 自定义圆形进度条的实现方式
  18. 数学建模笔记(十五):多元统计分析及R语言建模(判别分析、聚类分析、主成分分析、因子分析,含数据代码注释,均可供运行)
  19. 详解计算机内存及基于内存理解的几种数据结构
  20. 微信运营:自媒体人必须知道的20个自媒体平台

热门文章

  1. 云计算与大数据实验二 Hadoop的安装和集群的搭建
  2. FCPX MG动画元素包
  3. Skew 和 Jitter?
  4. 在安卓中压缩GIF的几种方法(附实例代码)
  5. 免费的区块链数据API网址
  6. MLDN魔乐科技 Oracle学习笔记 (3)
  7. js判断点在线上位置,距离各端点距离算法
  8. 正n边形的魔法阵,判断该魔法阵消耗的魔力和产生的能量。
  9. 查询今天比昨天温度高的日期
  10. SPWM基本原理详解(图文并茂+公式推导+C程序实现)