写道
socket相关知识
1.socket的定义:
所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 以J2SDK-1.6为例,Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
2.Socket API (比较重量级的api)
accept()方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。
getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。 注意:其中getInputStream和getOutputStream方法均可能会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
写道
常用的Socket类型
有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 Socket建立为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:int socket(int domain, int type, int protocol);domain指明所使用的协议族,通常为AF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型:SOCK_STREAM 或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值0。Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。 Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。 Socket执行体为你管理描述符表。两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。
写道
开发原理:
服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024---65535的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
代码如下:
服务器端:
package com.xiawenquan.serversocket.demo;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 发送端:
* @author xiawenquan
*
*/
public class FileSenderServerce {
private static ServerSocket serverSocket = null;
public static void main(String[] args) {
new FileSenderServerce().startSend("F:\\FunshionMedia\\android手机服务器FtpDemo.txt",8080);
}
private void startSend(String filePath,int port) {
// TODO Auto-generated method stub
DataOutputStream outputStream = null;
DataInputStream inputStream = null;
Socket socket = null;
try {
File file = new File(filePath);
serverSocket = new ServerSocket(port);
System.out.println("连接通道已经建立");
while(true){//可以连接多个客户端
socket = serverSocket.accept();
System.out.println("正式建立连接");
if(socket != null){
outputStream = new DataOutputStream(socket.getOutputStream());
// 将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,
// 具体可以参见Think In Java 4th里有现成的代码。
outputStream.writeUTF(file.getName());
System.out.println("发送文件名称 == " + file.getName());
outputStream.writeLong((long) file.length());
System.out.println("发送文件大小 == " + file.length());
outputStream.flush();//发送
//从本地读取要上传的文件
inputStream = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
int buffSize = 1024;
byte buff[] = new byte[buffSize];
while(true){
if(inputStream != null){
int zise = inputStream.read(buff);
if(zise == -1){
break;
}
outputStream.write(buff, 0, zise);//把读取的数据写到输出流中
}
}
outputStream.flush();//把输出流中的数据刷新出去
System.out.println("上传完成");
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {// 关闭所有连接
try {
if(outputStream != null){
outputStream.close();
}
if(inputStream != null){
inputStream.close();
}
if(socket != null){
socket.close();
}
if(serverSocket != null){
serverSocket.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
接收端:
package com.xiawenquan.serversocket.demo;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.Socket;
public class FlieAcceptClient {
public static void main(String[] args) {
//192.168.0.5本机的ip
new FlieAcceptClient().getFile("F:\\FunshionMedia\\aa\\", "192.168.0.5", 8080);
}
private void getFile(String savePath, String ip, int port){
DataInputStream inputStream = null;
DataOutputStream outputStream = null;
Socket socket = null;
try {
socket = new Socket(ip, port);
inputStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
int sizeBuff = 1024;
byte buff[] = new byte[sizeBuff];
int passedlen = 0;
// 获取文件名称
savePath += inputStream.readUTF();
File file = new File(savePath);
if(file.exists()){
System.out.println("文件已经存在");
file.delete();
}
//在本地创建一个文件
outputStream = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(file))));
// 获取文件长度
long len = inputStream.readLong();
System.out.println("文件的长度为:" + len + " KB");
System.out.println("开始接收文件!");
int readZise = -1;
// 获取文件
while(true){
if(inputStream != null){
readZise = inputStream.read(buff);
if(readZise == -1){
break;
}
passedlen += readZise;
System.out.println("文件接收了" + (passedlen * 100 / len) + "%");
outputStream.write(buff, 0, readZise);
outputStream.flush();
if(passedlen == len){
break;//当读到的字节大小和文件大小一样就说明已经读完了
}
}
}
System.out.println("接收完成,文件存为" + savePath);
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
return;
}finally{
try {
if(inputStream != null){
inputStream.close();
}
if(outputStream != null){
outputStream.close();
}
if(socket != null){
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
工程如下:
分享到:
相关推荐
Socket通讯原理 深入详解嵌入式开发
Socket编程原理是网络通信的核心,它允许两个网络进程通过TCP/IP协议进行通信。在UNIX系统中,Socket作为网络应用编程接口被广泛采用,源于BSD Unix并逐渐被移植到其他操作系统,如DOS和Windows。Socket编程涉及到多...
总结起来,"发那科机器人与视觉socket通讯"涉及到的技术点包括视觉系统集成、Socket通讯原理、FANUC机器人编程、寄存器变量的读写以及IO信号的使用,通过这些技术,实现了机器人与视觉系统间的高效协同工作。
socket编程原理
2. **Socket通讯原理**: Socket是网络编程中的一个接口,它允许应用程序通过Internet进行通信。Socket的工作原理可以理解为两台计算机之间的通信管道,数据通过这个管道在两台机器之间传输。在TCP/IP协议栈中,...
主要介绍socket网络通信原理,客户端与服务端网络通信!
Socket 通讯原理图如图 1 所示。服务器:创建 ServerSocket 于指定的端口监听客户端的连接请求,有连接为服务端创建一个可以通讯的 Socket。客户端:使用 Socket 连接到服务器,发送和接收数据。 在实现中,使用了...
本文将深入探讨客户端和服务器端的Socket通讯原理、实现过程以及相关知识点。 首先,理解Socket的基本概念至关重要。Socket,又称为套接字,是网络编程中的一个接口,为进程间通信(IPC)提供了标准化的方法。在...
Java基于socket实现的客户端和服务端通信功能完整实例 在Java中,Socket是实现网络通信的基础,通过Socket可以实现客户端和服务器端之间的通信。本文将详细介绍Java基于Socket实现的客户端和服务端通信功能,包括...
- 使用PB9的调试工具,可以逐行跟踪代码,了解每个步骤的工作原理,这对于学习和优化SOCKET通讯程序非常有帮助。 5. **应用场景**: - PB9中的SOCKET通讯常用于实时数据交换,例如监控系统、股票交易系统、在线...
在本文中,我们将深入探讨“很实用的Socket通讯工具”这一主题,了解Socket的基本原理、如何使用以及其在实际应用中的价值。 Socket,通常被称为套接字,是网络通信中的接口,允许应用程序通过TCP/IP协议栈发送和...
本示例提供了一个完整的C# Socket通讯/TCP通讯的代码demo,旨在帮助开发者理解和应用网络通信技术。 首先,我们要理解Socket的基本概念。Socket在计算机网络中扮演着桥梁的角色,它允许两台计算机通过网络进行数据...
【内容概要】 用socket套接字实现简易服务器的建立与数据的传输 ...【作用】在此资源中,你可以对照着源代码与注释,了解socket通讯 原理的同时增长见识,帮助你举一反三,为你提供一个可拓展的、可读性强的代码框架。
- "SOCKET通讯案例"可能涵盖通用的Socket通信技术,包括与非欧姆龙设备的通信,提供了更广泛的适用性。 通过学习和实践这些案例,开发者可以掌握如何在实际项目中利用TCP和UDP Socket与欧姆龙PLC进行有效通信,...
机器人通过Socket通讯可以将寄存器中的数据,按照特定的格式发送给上位机。例如,在指令规则中,机器人可以发送五个连续寄存器的值给上位机,格式如#100,200.123,-10.567,-20,0.005。 其次,手册介绍了适用于所有...
在"C# SOCKET 通讯例子"中,我们有两个关键部分:通讯Client端和通讯Server端。以下是这两个部分的简要概述: 1. **通讯Server端**: - 创建Socket对象并绑定到特定的IP地址和端口号,这通常使用`Socket.Bind()`...
Socket通讯是计算机网络编程中的一个基础概念,它允许两台或多台计算机通过网络进行通信。在本"Socket通讯简单Demo"中,包含了服务端(socketserver)和客户端(socketclient)两个部分,它们共同构建了一个简易的...
Socket通讯在IT行业中是网络编程的基础,特别是在C#这样的多用途编程语言中,Socket通信扮演着重要的角色。本文将深入探讨C#中的Socket通信,帮助理解其原理、使用方法及其实现简易通信工具的关键步骤。 Socket是...
总结,Android实现Socket通讯涉及创建和管理Socket对象,以及正确处理网络数据的读写。通过上述步骤,开发者可以构建基本的客户端-服务器通信模型,进一步扩展功能,如数据序列化、心跳机制、断线重连等,以满足各种...