初识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网络编程
什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...
随机推荐
- AS中加载gradle时出现Gradle sync failed: Could not find com.android.tools.build:gradle.的错误
时间:2019/12/7 这次接着整理加载gradle时出现的错误 出现的错误: Gradle sync failed: Could not find com.android.tools.build: ...
- MyBatis 介绍
MyBatis 介绍 MyBatis 是一款优秀的 ORM(Object Relational Mapping,对象关系映射)框架,它可以通过对象和数据库之间的映射,将程序中的对象自动存储到数据库中. ...
- npm、node版本升级与淘宝镜像
npm --version == npm -v 查看npm版本 node -v 查看node版本 升级npm版本 npm ...
- 实验6:路由器IOS升级
路由器IOS升级 Cisco路由器IOS映像恢复及升级方法 一.Cisco 1000,1600,2500,4000系列 1.IOS映像恢复的方法及步骤 1) 连接PC的COM1口与路由器的consol ...
- nginx的进程结构
nginx分为单进程和多进程,默认是多进程 进程架构: 父进程master process 子进程worker process和cache manager cache loader 高可用性 高可靠 ...
- 秒秒钟破解eval加密
前言 准确的说eval处理过的代码应该叫做压缩代码,不过效果上算是加密过了一样!很多小伙伴不想直接让别人看到自己的js代码往往就会采取这样的处理措施.不过,其实这样的方法只能防御那些小白.对于真正的 ...
- DataGuard---->主库和备库都配置 db_file_name_convert和log_file_name_convert的作用
一.参数说明 [1] db_file_name_convert db_file_name_convert 主数据库和备用数据库的数据文件转换目录对映(如果两数据库的目录结构不一样),如果有多个对映,逐 ...
- OpenCV3入门(八)图像边缘检测
1.边缘检测基础 图像的边缘是图像的基本特征,边缘点是灰度阶跃变化的像素点,即灰度值的导数较大或极大的地方,边缘检测是图像识别的第一步.用图像的一阶微分和二阶微分来增强图像的灰度跳变,而边缘也就是灰度 ...
- Yandex Big Data Essentials Week1 Unix Command Line Interface File Content exploration
cat displays the contents of a file at the command line copies or apppend text file into a document ...
- JAVA System.exit(0) 和 System.exit(1) 的区别
System.exit(int state) 方法都是来结束当前运行的java虚拟机.所有System.exit(1).System.exit(0) 执行后都会退出程序. state为0时时正常退出, ...