初识Socket通讯编程(一)
- 传统的io流方式(BIO模式),阻塞型;
- NIO的方式;
- AIO的方式;
//<--------------服务端代码-------------------->
public class SocketReadLister implements Runnable { private final int tcpPort=9999;
private ServerSocket serverSocket; @Override
public void run() {
try {
serverSocket = new ServerSocket(this.tcpPort);
while(true){
Socket socket = serverSocket.accept();
//socket.setSoTimeout(5*1000);//设置读取数据超时时间为5s
new Thread(new SocketReadThread(socket)).start();
}
}catch (Exception e){
e.printStackTrace();
}
} public static void main(String[] args) throws Exception{
new Thread(new SocketReadLister()).start();
}
} public class SocketReadThread implements Runnable {
private Socket socket;
public SocketReadThread(Socket socket) {
this.socket = socket;
} @Override
public void run() {
byte[] data = new byte[1024];
try {
InputStream is=socket.getInputStream();
int length=0;
int num=is.available();
while((length = is.read(data)) != -1){
String result = new String(data);
System.out.println("数据available:"+num);
System.out.println("数据:"+result);
System.out.println("length:" + length);
}
System.out.print("结束数据读取:"+length);
}catch (SocketTimeoutException socketTimeoutException){
try {
Thread.sleep(2*1000);
}catch (Exception e) {
e.printStackTrace();
}
run();
} catch (Exception e){
e.printStackTrace();
try {
socket.close();
}catch (IOException io){
io.printStackTrace();
}
}
}
}
//<---------------------客户端代码---------------------------->
public class SocketClient implements Runnable {
private final int tcpPort=9999;
private Socket socket; @Override
public void run() {
String msg = "ab23567787hdhfhhfy"; byte[] byteMsg = msg.getBytes(); try {
socket = new Socket("127.0.0.1", 9999);
OutputStream out = socket.getOutputStream();
InputStream inputStream=socket.getInputStream(); out.write(byteMsg);
Thread.sleep(10*1000);
char[] chars=msg.toCharArray();
String str="";
/*out.flush();*/
for(int i=0;i<msg.length();i++) {
str=chars[i]+"-"+i;
out.write(str.getBytes());
Thread.sleep(1*1000);
}
byte[] bytes=new byte[8];
while(true) {
if(inputStream.available()>0) {
if(inputStream.read(bytes)!=-1) {
System.out.println(new String(bytes));
}
}
Thread.sleep(10*1000);
}
} catch (Exception e) {
e.printStackTrace();
try {
socket.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
} public static void main(String[] args) {
new Thread(new SocketClient()).start();
} }
while(true){
if(is.available()>0){
is.read(data);
}
}
if (nRecv < nRecvNeed){
int nSize = 0;
wsaBuf=new byte[nRecvNeed-nRecv];
int readCount = 0; // 已经成功读取的字节的个数
try {
while (readCount < wsaBuf.length) {
//Thread.sleep(100);//读取之前先将线程休眠,避免循环时,程序占用CPU过高
try {
availableNum=inputStream.available();
if(availableNum>0){
readCount += inputStream.read(wsaBuf, readCount, (wsaBuf.length - readCount));//避免数据读取不完整
}
}catch (SocketTimeoutException timeOut){
System.out.println("读取超时,线程执行休眠操作,2秒后再读取");
Thread.sleep(2*1000);
}
}
}catch (Exception e){
System.out.println("读取数据异常");
e.printStackTrace();
close();//关闭socket连接
break;
}
nSize=wsaBuf.length;
nRecv+=nSize;
}
初识Socket通讯编程(一)的更多相关文章
- 天地币:所用到的 Android Socket 通讯编程技术试验
1.为了开发"天地币"这个Android手机项目,须要用到Socket编程. 2.天地币是一种类似于比特币的虚拟货币. 3.为了赚取CSDN的C币,须要写篇博客. 4.干脆将调试S ...
- 门禁系统socket通讯编程
最近遇到一个socke udp协议通讯的需求,而且是16进制数据接收.这样在传输参数的时候老是提示参数错误,因为计算机是不能直接传输16进制的,会自行转换,所有以下代码非常完美的解决我的问题,同时也让 ...
- 高性能、高可用性Socket通讯库介绍 - 采用完成端口、历时多年调优!(附文件传输程序)
前言 本人从事编程开发十余年,因为工作关系,很早就接触socket通讯编程.常言道:人在压力下,才可能出非凡的成果.我从事的几个项目都涉及到通讯,为我研究通讯提供了平台,也带来了动力.处理socket ...
- TCP网络编程(Socket通讯)
TCP 网路编程: 1.TCP 三次握手: 第一次握手,客户端向服务器端发出连接请求,等待服务器确认. 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求. 第三次握手,客户端再次向服 ...
- [转] C#.Net Socket网络通讯编程总结
1.理解socket1).Socket接口是TCP/IP网络的应用程序接口(API).Socket接口定义了许多函数和例程,程序员可以用它们来开发TCP/IP网络应用程序.Socket可以看成是网络通 ...
- python学习之路---day25( 网络编程基础和初识socket)
基本网络知识和初识socket一:基本知识 网线:传输电信号 集线器:将所有连接到集线器的网络设备连通起来 交换机: 升级版的集线器 网卡:接受电信号 MAC地址:物理地址: 8C-88-4B-88- ...
- 初识Socket通信:基于TCP和UDP协议学习网络编程
学习笔记: 1.基于TCP协议的Socket网络编程: (1)Socket类构造方法:在客户端和服务器端建立连接 Socket s = new Socket(hostName,port);以主机名和端 ...
- 网络通信 & 初识socket
本节主要内容: 1.客户短\服务端架构 2.网络通信的流程 3.初识socket 一.客户端\服务端架构 客户端\服务端架构: 即Client/Server (C/S) 结构,是大家熟知的软件系统体系 ...
- python之Socket网络编程
什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...
随机推荐
- CSS快速入门例子
CSS入门应用 01-结合方式01 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- Kubernetes-Ingress资源详解
什么是Ingress #阿里云称之为ingress路由!在 Kubernetes 集群中,主要用于接入外部请求到k8s内部,Ingress是授权入站连接到达集群服务的规则集合,为您提供七层负载均衡能力 ...
- ATL的GUI程序设计(4)
第四章 对话框和控件 对于Win32 GUI的程序设计来说,其实大部分的情况下我们都不需要自己进行窗口类的设计,而是可以使用Win32中与用户交互的标准方式--对话框(Dialog Box).我们可以 ...
- Linq扩展方法获取单个元素
在使用Linq 提供的扩展方法时,First(OrDefault), Single(OrDefault), Last(OrDefault)都具有返回单个元素的功能.MSDN对这些方法的描述只有功能说明 ...
- winform应用如何发布(不用打包)、并提醒用户自动更新
环境:VS2019 community C# winform 应用程序 设计应用程序界面 编写对应代码 使用PS设计程序标识ICON F4打开属性: 设置ICON 设置背景 打开项目属性 打开“发 ...
- 简单看看ThreadPoolExecutor原理
线程池的作用就不多说了,其实就是解决两类问题:一是当执行大量的异步任务时线程池能够提供较好的性能,在不使用线程池时,每当需要执行异步任务是需要直接new一个线程去执行,而线程的创建和销毁是需要花销的, ...
- Go语言实现:【剑指offer】二进制中1的个数
该题目来源于牛客网<剑指offer>专题. 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析: 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1 ...
- error C2662
原因:关于const的问题 具体错误:函数的参数列表中参数签名为const,但是却调用了该参数的非const的成员函数 例子: 即使我们知道NoConst()并不会改变类的data成员,编译器依旧会报 ...
- SPH液面重构过程中的问题
使用粒子方法进行流体特效模拟需要进行液面重构,构造出流体的自由表面,液面重构方法也是一个独立的研究方向,针对其的研究已经有了很多成果,包括液面的平滑度.精度和并行效率等. 在这里,主要是记录一下我在液 ...
- expect知识梳理
1 expect expect软件用于实现非交互式操作,实际应用中常用于批量部署,可以帮助运维人员管理成千上万台服务器. expect实现非交互式操作主要是在程序发出交互式询问时,按条件传递程序所需的 ...