`
夏文权
  • 浏览: 243831 次
  • 性别: Icon_minigender_1
  • 来自: 贵州
社区版块
存档分类
最新评论

socket 通讯原理

 
阅读更多
写道

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通讯原理 深入详解嵌入式开发

    socket编程原理,详细的描述了网络结构以及socket通讯原理

    Socket编程原理是网络通信的核心,它允许两个网络进程通过TCP/IP协议进行通信。在UNIX系统中,Socket作为网络应用编程接口被广泛采用,源于BSD Unix并逐渐被移植到其他操作系统,如DOS和Windows。Socket编程涉及到多...

    发那科机器人与视觉socket通讯

    总结起来,"发那科机器人与视觉socket通讯"涉及到的技术点包括视觉系统集成、Socket通讯原理、FANUC机器人编程、寄存器变量的读写以及IO信号的使用,通过这些技术,实现了机器人与视觉系统间的高效协同工作。

    socket编程原理.pdf

    socket编程原理

    基于HPSocket实现 socket 通讯 - 修正版 ( C# demo 、 C++ dll )

    2. **Socket通讯原理**: Socket是网络编程中的一个接口,它允许应用程序通过Internet进行通信。Socket的工作原理可以理解为两台计算机之间的通信管道,数据通过这个管道在两台机器之间传输。在TCP/IP协议栈中,...

    socket通信原理

    主要介绍socket网络通信原理,客户端与服务端网络通信!

    JAVA中使用Socket通讯的实现.pdf

    Socket 通讯原理图如图 1 所示。服务器:创建 ServerSocket 于指定的端口监听客户端的连接请求,有连接为服务端创建一个可以通讯的 Socket。客户端:使用 Socket 连接到服务器,发送和接收数据。 在实现中,使用了...

    Socket 通讯客户端和服务器端

    本文将深入探讨客户端和服务器端的Socket通讯原理、实现过程以及相关知识点。 首先,理解Socket的基本概念至关重要。Socket,又称为套接字,是网络编程中的一个接口,为进程间通信(IPC)提供了标准化的方法。在...

    Java基于socket实现的客户端和服务端通信功能完整实例

    Java基于socket实现的客户端和服务端通信功能完整实例 在Java中,Socket是实现网络通信的基础,通过Socket可以实现客户端和服务器端之间的通信。本文将详细介绍Java基于Socket实现的客户端和服务端通信功能,包括...

    PB9实现的SOCKET通讯协议

    - 使用PB9的调试工具,可以逐行跟踪代码,了解每个步骤的工作原理,这对于学习和优化SOCKET通讯程序非常有帮助。 5. **应用场景**: - PB9中的SOCKET通讯常用于实时数据交换,例如监控系统、股票交易系统、在线...

    很实用的 socket通讯工具

    在本文中,我们将深入探讨“很实用的Socket通讯工具”这一主题,了解Socket的基本原理、如何使用以及其在实际应用中的价值。 Socket,通常被称为套接字,是网络通信中的接口,允许应用程序通过TCP/IP协议栈发送和...

    C# Socket通讯/TCP通讯,完整代码demo

    本示例提供了一个完整的C# Socket通讯/TCP通讯的代码demo,旨在帮助开发者理解和应用网络通信技术。 首先,我们要理解Socket的基本概念。Socket在计算机网络中扮演着桥梁的角色,它允许两台计算机通过网络进行数据...

    SOCKET简单本地服务器连接实现多台设备实时通讯-源码+注释

    【内容概要】 用socket套接字实现简易服务器的建立与数据的传输 ...【作用】在此资源中,你可以对照着源代码与注释,了解socket通讯 原理的同时增长见识,帮助你举一反三,为你提供一个可拓展的、可读性强的代码框架。

    欧姆龙TCP UDP Socket网络通讯.zip

    - "SOCKET通讯案例"可能涵盖通用的Socket通信技术,包括与非欧姆龙设备的通信,提供了更广泛的适用性。 通过学习和实践这些案例,开发者可以掌握如何在实际项目中利用TCP和UDP Socket与欧姆龙PLC进行有效通信,...

    FANUC机器人Socket Message通讯设置及使用手册

    机器人通过Socket通讯可以将寄存器中的数据,按照特定的格式发送给上位机。例如,在指令规则中,机器人可以发送五个连续寄存器的值给上位机,格式如#100,200.123,-10.567,-20,0.005。 其次,手册介绍了适用于所有...

    C# SOCKET 通讯例子

    在"C# SOCKET 通讯例子"中,我们有两个关键部分:通讯Client端和通讯Server端。以下是这两个部分的简要概述: 1. **通讯Server端**: - 创建Socket对象并绑定到特定的IP地址和端口号,这通常使用`Socket.Bind()`...

    Socket通讯简单Demo

    Socket通讯是计算机网络编程中的一个基础概念,它允许两台或多台计算机通过网络进行通信。在本"Socket通讯简单Demo"中,包含了服务端(socketserver)和客户端(socketclient)两个部分,它们共同构建了一个简易的...

    C#简易Socket通讯工具

    Socket通讯在IT行业中是网络编程的基础,特别是在C#这样的多用途编程语言中,Socket通信扮演着重要的角色。本文将深入探讨C#中的Socket通信,帮助理解其原理、使用方法及其实现简易通信工具的关键步骤。 Socket是...

    android实现socket通讯

    总结,Android实现Socket通讯涉及创建和管理Socket对象,以及正确处理网络数据的读写。通过上述步骤,开发者可以构建基本的客户端-服务器通信模型,进一步扩展功能,如数据序列化、心跳机制、断线重连等,以满足各种...

Global site tag (gtag.js) - Google Analytics