socket 传输获取文件名

最近在一个文件传输的小项目,可是发现俩个手机之间传输文件的时候,另一个手机无法获取文件名和文件类型,查阅资料发现有个fileinputstream可以合并流,谁知用起来问题很多,有没有大神给点意见!

1 2 3 4 5
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
socket 网络编程传输文件
进行网络通信,socket编程,传输文件过程中,如何来通过调用函数来获得传输文件的大小,以及传输该文件相对应的时间,有什么好的办法吗?
Android传输基于socket传输视频文件到pc
我写了一个录制视频的app然后把录制的视频传送到pc端,但是传输到pc端的视频文件变大,而且无法播放,传输方式是DataOutputStream,具体代码如下; package com.example.lenovo.viedoapp; import android.app.Activity; import android.hardware.Camera; import android.media.MediaRecorder; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import com.google.android.gms.common.api.GoogleApiClient; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import static com.example.lenovo.viedoapp.R.id.surfaceView; public class viedoApp extends Activity implements View.OnClickListener, SurfaceHolder.Callback { Button but_start; Button but_stop; Button but_send; SurfaceView sfv; SurfaceHolder sfh; Camera camera; MediaRecorder mediaRecorder; File videoFile; File aduioFile; Send send; /** * ATTENTION: This was auto-generated to implement the App Indexing API. * See https://g.co/AppIndexing/AndroidStudio for more information. */ private GoogleApiClient client; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_viedo_app); but_start = (Button) findViewById(R.id.but_start); but_start.setOnClickListener(this); but_stop = (Button) findViewById(R.id.but_stop); but_stop.setOnClickListener(this); but_send=(Button)findViewById(R.id.but_send); but_send.setOnClickListener(this); sfv = (SurfaceView) findViewById(surfaceView); sfh = sfv.getHolder(); sfh.addCallback(this); } public void onClick(View v) { if (v.getId() == but_start.getId()) { camera.stopPreview(); camera.release(); camera = null; mediaRecorder = new MediaRecorder(); mediaRecorder.setPreviewDisplay(sfh.getSurface()); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.setVideoSize(320, 240); mediaRecorder.setVideoFrameRate(15); mediaRecorder.setOrientationHint(90); videoFile = new File(getExternalCacheDir(), "video.mp4"); mediaRecorder.setOutputFile(videoFile.getAbsolutePath()); try { mediaRecorder.prepare(); mediaRecorder.start(); //send = new Send(videoFile); //new Thread(send).start(); } catch (IOException e) { e.printStackTrace(); } } else if (v.getId() == but_stop.getId()) { //send.flag = false; mediaRecorder.stop(); mediaRecorder.release(); mediaRecorder = null; camera = Camera.open(); try { camera.setPreviewDisplay(sfh); camera.setDisplayOrientation(90); camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } else if(v.getId()==but_send.getId()){ send = new Send(videoFile); new Thread(send).start(); // Toast.makeText(viedoApp.this, "完成", Toast.LENGTH_SHORT).show(); } } public void surfaceCreated(SurfaceHolder holder) { camera = Camera.open(); try { camera.setPreviewDisplay(holder); camera.setDisplayOrientation(90); camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceDestroyed(SurfaceHolder holder) { camera.stopPreview(); camera.release(); camera = null; sfv = null; sfh = null; mediaRecorder = null; } } class Send implements Runnable { Socket socket = null; OutputStream os = null; File file = null; FileInputStream fis = null; byte[] bytes; boolean flag = true; DataOutputStream dos=null; Send(File file) { this.file = file; } public void connect() { try { socket = new Socket("192.168.1.108", 9991); os = socket.getOutputStream(); dos = new DataOutputStream(os); fis= new FileInputStream(file); String a = file.getAbsolutePath(); // Log.d("Send", a); } catch (IOException e) { } bytes = new byte[1024]; long a=0; String b=null; try { while ( fis.read(bytes, 0, bytes.length)>0) { dos.write(bytes,0,bytes.length); dos.flush(); a=(a+bytes.length); } b=a+""; Log.v("Send",b); // Log.v("Send",a.toString()); System.out.print(b); } catch (IOException e) { e.printStackTrace(); } finally{ if(fis!=null){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } if(dos!=null){ try { dos.flush(); dos.close(); } catch (IOException e) { e.printStackTrace(); } } } } public void run() { connect(); } } 求求懂得大神给我解答一下,急需
Socket通信问题,两个手机间进行文件传输?
有没有人Socket实现两个手机之间的文件传输??一个手机app做为服务端,另一个做为客户端,通过Socket连接后,两个app之间可以进行文件传输!急急急急急急
socket网络编程 文件传输的问题?
socket网络编程,目前是同时开启两个进程两个线程,同时从server那端传输两个文件过来,是可以实现,任意格式的文件和任何大小的文件都可以。现在的项目要求是这两个进程要同时传输一个文件。我的思路是一个进程传输该文件的前一半,另一个进程传输该文件的后一半,具体实现就不知道了,希望大家给点意见,已经摸索了好几天。毫无头绪啊!!!!!项目马上就要完成了,谢谢大家。
C#通过Socket实现多文件传输
大概需求是客户端发送一个xml文件名给服务器,服务器返回xml文件。这一步没问题。 后面客户端需要解析xml文件,根据解析出的文件名,去服务器获取指定文件。现在问题是第一次服务器发送xml文件之后就侦听不到客户端后面的请求了 服务端代码: ``` #region 窗体加载 private void Form1_Load(object sender, EventArgs e) { Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//Socket设置、IPv4、Stream类型套接字、TCP协议 IPAddress ip = IPAddress.Any;//获取本机IP IPEndPoint point = new IPEndPoint(ip, 18002);//设置IP和端口 socketWatch.Bind(point);//绑定端口 memoEdit1.Text = "开始侦听..."; socketWatch.Listen(100);//最大连接数 Thread th = new Thread(SendFileFuncssss);//创建新线程 th.Start(socketWatch);//启动线程 th.IsBackground = true;//设置后台运行线程 } #endregion #region 根据客户端传输文件名发送指定文件 public void SendFileFuncssss(object obj) { Socket socket = obj as Socket; while (true) { Socket socketServices = socket.Accept(); byte[] buffer = new byte[1024]; int num = socketServices.Receive(buffer);//接收到字节数 string str = Encoding.UTF8.GetString(buffer, 1, num - 1);//接收到字符串 if (buffer[0] == 0)//表示接收到的是消息数据 { TxtAddContent(socketServices.RemoteEndPoint + "连接成功"); string FileName = str; if (FileName.Equals("AutoUpdater.xml"))//获取xml配置文件 { //发送XML文件到客户端 using (FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + FileName, FileMode.Open)) { byte[] arrFile = new byte[1024 * 1024 * 5]; int length = fs.Read(arrFile, 0, arrFile.Length); byte[] arrFileSend = new byte[length + 1]; arrFileSend[0] = 1; // 用来表示发送的是xml文件数据 Buffer.BlockCopy(arrFile, 0, arrFileSend, 1, length); socketServices.Send(arrFileSend);// 发送数据到客户端 } } if (!FileName.Equals("AutoUpdater.xml")) { //发送更新文件到客户端 using (FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "\\FileFolder\\" + FileName, FileMode.Open)) { byte[] arrFile = new byte[1024 * 1024 * 50]; int length = fs.Read(arrFile, 0, arrFile.Length);//获取文件长度 byte[] arrFileSend = new byte[length + 1]; arrFileSend[0] = 1; // 用来表示发送的是xml文件数据 Buffer.BlockCopy(arrFile, 0, arrFileSend, 1, length); socketServices.Send(arrFileSend);// 发送数据到服务端 } } } } } #endregion ``` 客户端代码: ``` Socket socketClient = obj as Socket; socketClient.Connect(ipEndPoint); #region 修改本地文件名称 string Oldpath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater.xml";//修改前名称 string Newpath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater_Back.xml";//修改后名称 if (File.Exists(Oldpath)) { File.Delete(Newpath); File.Move(Oldpath, Newpath);//更改文件名 } #endregion if (socketClient.Connected) { try { TxtReceiveAddContent("连接成功"); //发送链接成功提示 byte[] arrMsg = Encoding.UTF8.GetBytes("AutoUpdater.xml"); byte[] arrSendMsg = new byte[arrMsg.Length + 1];//加一位标识用于表示是文字消息还是文件 arrSendMsg[0] = 0; // 用来表示发送的是消息数据 Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length); socketClient.Send(arrSendMsg); //获取文件 string dirPath = Application.StartupPath; byte[] buffer = new byte[1024 * 1024 * 5]; int lenght = socketClient.Receive(buffer); if (buffer[0] == 1) { using (FileStream fs = new FileStream(dirPath + "\\AutoUpdater.xml", FileMode.Create)) { fs.Write(buffer, 1, lenght - 1); } TxtReceiveAddContent("配置文件接收成功:AutoUpdater.xml");//追加提示备注 } #region 获取XML里需要更新的文件和需要删除的文件 List<string> updatelist = new List<string>();//需要更新的文件集合 List<string> deletelist = new List<string>();//需要更新的文件集合 //获取历史xml文件更新时间以及更新版本 XDocument Olddocument = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater_Back.xml"); //获取到XML的根元素进行操作 XElement Oldroot = Olddocument.Root; XElement Oldele = Oldroot.Element("UpdateInfo"); //获取旧更新时间标签的值 XElement OldUpdateTime = Oldele.Element("UpdateTime"); //获取旧版本号标签的值 XElement OldVersion = Oldele.Element("Version"); //获取最新xml文件更新时间以及更新版本 XDocument Newdocument = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater.xml"); //获取到XML的根元素进行操作 XElement Newroot = Newdocument.Root; XElement Newele = Newroot.Element("UpdateInfo"); //获取旧更新时间标签的值 XElement NewUpdateTime = Newele.Element("UpdateTime"); //获取旧版本号标签的值 XElement NewVersion = Newele.Element("Version"); if (NewUpdateTime != OldUpdateTime || NewVersion != OldVersion) { //获取需要更新的文件列表 XElement NewUpList = Newroot.Element("UpdateList"); IEnumerable<XElement> UpList = NewUpList.Elements(); foreach (XElement item in UpList) { updatelist.Add(item.Value); } //获取需要删除的文件列表 XElement NewDelList = Newroot.Element("DeleteList"); IEnumerable<XElement> DelList = NewDelList.Elements(); foreach (XElement item in DelList) { deletelist.Add(item.Value); } } #endregion #region 循环获取更新文件 for (int i = 0; i < updatelist.Count; i++) { //发送链接成功提示 byte[] FileName = Encoding.UTF8.GetBytes(updatelist[i]); byte[] SendFileName = new byte[FileName.Length + 1];//加一位标识用于表示是文字消息还是文件 SendFileName[0] = 0; // 用来表示发送的是消息数据 Buffer.BlockCopy(FileName, 0, SendFileName, 1, FileName.Length); socketClient.Send(SendFileName); //获取文件 string FilePath = Application.StartupPath + "\\WebFile"; byte[] bufferByFile = new byte[1024 * 1024 * 50]; int lenghtByFile = socketClient.Receive(bufferByFile); if (bufferByFile[0] == 1) { using (FileStream fs = new FileStream(FilePath + "\\" + updatelist[i], FileMode.Create)) { fs.Write(bufferByFile, 1, lenghtByFile - 1); } TxtReceiveAddContent("文件接收成功:" + updatelist[i]); } } #endregion #region 循环删除指定文件 for (int i = 0; i < deletelist.Count; i++) { try { string path = AppDomain.CurrentDomain.BaseDirectory + "\\WebFile\\" + deletelist[i]; File.Delete(path); TxtReceiveAddContent("删除文件[" + deletelist[i] + "]成功"); } catch (Exception) { TxtReceiveAddContent("删除文件[" + deletelist[i] + "]失败"); continue; } } #endregion } catch (Exception ex) { File.Move(Newpath, Oldpath);//连接失败,还原文件名 MessageBox.Show(ex.ToString()); throw; } ``` 调试在客户端进循环的时候服务端侦听不到了 刚接触socket,多谢大佬们解答
一个socket问题,文件传输,但不保存问题。大神们在哪儿呢
用socket 传文件, 比如说传视频,接收方 不下载,只将接受到的数据存在内存中,并在内存中使用 播放它。大神们,帮帮忙嘞~~~
JAVA SOCKET数据传输完整性校验
大文件传输时候,小弟遇到如下问题: 1.怎么校验每包数据是否完整,发现这包数据不完整时,怎么重新获取一次本包数据 2.当数据传输完成时校验完整性,不完整则重新传输 广大的各位云友提下思路啊,谢谢
基于socket的文件传输
用MFC做的一个小的聊天工具,要实现一个文件传输的功能,但是用ios::binary打开文件后有些文件发送不了,只能够发送txt文本,不知道为什么会这样 debug的时候发现用来将要发送的文件内容读取的缓冲区里的内容是 无效的字符串 ,按道理来说用ios::binary打开的文件应该是统一的二进制流文件,但是为什么有些字符无法读到缓冲区(字符型数组)里呢?望大神能够指点一二 ``` char *sendData; //定义一个缓冲区来装载文件内容 while (true) //进入死循环 { sendData = new char[sendMsg_size]{ '\0' }; //为缓冲区分配空间并且初始化 send_file.read(sendData, sendMsg_size - 2); //使用read方法从文件中读取适当的内容,send_file是fstream的文件对象,已经和文件关联了 for (int i = sendMsg_size - 1;i > 0;i--) //这一个循环主要是将所有读入的内容向后移动一个位置,从而给缓冲区第一个位置空出来,然后用一个‘f’来表示这一段内容是一个文件的内容,因为这是一个聊天工具,所以想要用不同的消息的头来表示这个消息的性质 { sendData[i] = sendData[i - 1]; } sendData[0] = 'f'; iResult = send(Client_socket, sendData, strlen(sendData), 0); //send函数来发送装有文件内容的缓冲区 if (iResult == SOCKET_ERROR) { pointer->MessageBox(_T("发送失败!"), _T("错误"), MB_OK | MB_ICONERROR); delete[]sendData; return 0; } //异常处理 delete[]sendData; //这一轮发完之后就删除堆中的分配的空间 while (recvData[0] != 'o'); //从客户端那里要发过来一个特定的消息才能够进入下一步,这是为了让服务器发送文件的速度和客户端接受文件并且写入的速度相符合 recvData[0] = '\0'; //客户端接受好了后,服务器重置消息头 if (send_file.peek() == EOF) { break; } //如果读到文件尾的话就说明文件已经读完了,就可以跳出死循环了 } sendData = "e"; //发送一个特定的消息给客户端,告诉它已经发完了 send(Client_socket, sendData, strlen(sendData), 0); send_file.close(); //关闭文件 ```
关于Socket文件传输后删除失败
文件通过socket传输后 想要删除本地的对应文件 通过File delete 失败, 在程序未关闭情况下 手动删除,提示 文件正在被使用,按理解来说,这应该是文件流没有关闭的情况,但是,我已经写了close 了,而且经过测试,在不改动代码的情况下,如果不经过socket传输, 文件是可以删除的。 但是经由socket以后,文件就无法删除,我也试了 deleteOnExit 代码if 测试 提示,删除成功,但是 查看文件夹 后 文件并没有被删除。 何解? Help ~!! ``` private void TransFileToServer(String EnFilePath,OutputStream out) throws Exception{ FileInputStream fileIn= new FileInputStream(EnFilePath); FileChannel fcIn=null; MappedByteBuffer mbbfIn=null; int len=0,outLenth; fcIn=fileIn.getChannel(); mbbfIn=fcIn.map(FileChannel.MapMode.READ_ONLY, 0, fcIn.size()); byte[] outBytes=new byte[1024]; boolean more=true; while(more){ len=mbbfIn.limit()-mbbfIn.position(); if(len>outBytes.length) { mbbfIn.get(outBytes, 0, outBytes.length); out.write(outBytes); }else{ more=false; } } if(len>0){mbbfIn.get(outBytes, 0, len); out.write(outBytes,0,len); } if(fcIn!=null) fcIn.close(); if(fileIn!=null) fileIn.close(); if(out!=null) out.close(); if(clientSocket!=null) clientSocket.close(); } ``` 代码正常的。 就是无法删除。 这些是放在一个 swingworker 线程里,也执行完毕了
socket in c ; 报文传输是什么? socket 怎么传输二进制图片?
大神能帮帮忙解释解释吗? 与结构体传输有关系吗? 二进制图片怎么通过socket传输? 跪求社区情。
java中假设有JTextArea()经过socket传输
java中假设有JTextArea()经过socket传输如何区分输出文本是从哪个JTextArea传出来的,要加个监听吗
socket编程多线程文件传输
要实现的是开多线程传输一个文件,目的是提高传输速度。 思路是这样的:服务端开多线程,将文件分割,一个线程传输一块,客户端也开多线程,每个线程接受一块,最后拼成一个完整的文件。服务端支持多线程, 客户端要支持多线程, 然后客户端每个线程都建立连接到服务端请求一个文件的某个分片。 希望大家可以提供一下类似的代码,现在只有思路不知道怎么下手。
为什么socket传输对象的时候要将对象序列化?
对象序列化不是将对象转化成字节存入硬盘或者文件数据库中吗?和socket传输有什么关系呢?谢谢,小白不是很懂
socket传输文件时遇到的问题!
先给出代码。 客户端: SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(4444); HANDLE fp =CreateFile(L"E:\\aTest.txt",GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); DWORD fileLen =GetFileSize(fp, &fileLen); cout << "你选择的文件大小为:" << fileLen << endl; connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); char * buffer = new char[fileLen]; DWORD bufferLen = 0; ReadFile(fp, buffer, fileLen, &bufferLen, NULL); bool isFirst = true; int sendLen = 0; int sentLen = 0; char sendBuffer[200]; int leftLen = fileLen; while (true) { if (isFirst) { sendLen = send(sockClient, "Test", 1, 0); isFirst = false; if (sendLen < 0) { cout << "第一帧发送失败,程序结束." << endl; break; } Sleep(1000); continue; } if ((leftLen <= 0) || (sentLen >= fileLen)) break; if (leftLen >= 200) { memcpy(sendBuffer, buffer + sentLen, 200); sendLen = send(sockClient, sendBuffer, 200, 0); if (sendLen < 0) { cout << "帧发送失败,程序结束." << endl; break; } } else { memcpy(sendBuffer, buffer + sentLen, leftLen); sendLen = send(sockClient, sendBuffer, leftLen, 0); if (sendLen < 0) { cout << "帧发送失败,程序结束." << endl; break; } Sleep(1000); send(sockClient, "#", 1, 0); } sentLen += sendLen; leftLen = fileLen - sentLen; cout << "已经发送" << sentLen << endl; } if (sentLen == fileLen) cout << "文件发送成功." << endl; else cout << "文件发送失败." << endl; closesocket(sockClient); WSACleanup(); delete[] buffer; } 服务器端: SOCKET socksrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrsrv; addrsrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrsrv.sin_family = AF_INET; addrsrv.sin_port = htons(4444); bind(socksrv, (sockaddr*)&addrsrv, sizeof(SOCKADDR)); listen(socksrv, 5); SOCKADDR_IN addrclient; int len = sizeof(SOCKADDR); int recvLen = 0; int recvedLen = 0; DWORD writeLen; int fileLen = 0; char* buffer; char recvBuffer[200]; while (1) { SOCKET sockconn = accept(socksrv, (SOCKADDR*)&addrclient, &len); buffer = new char[1024 * 1024 * 10]; recvLen = recv(sockconn, recvBuffer, 200, 0); if (recvBuffer[0] == 'test') { printf("开始接收文件\n"); memset(recvBuffer, 0, 200); } while (true) { recvLen = recv(sockconn, recvBuffer, 200, 0); if ((recvLen == 1) && (recvBuffer[0] == '#')) break; memcpy(buffer + recvedLen, recvBuffer, recvLen); recvedLen += recvLen; printf("接收:%d\n", recvLen); printf("已经接收%i字节数据\n", recvedLen); } HANDLE fp = CreateFile(L"C://Users\apple\Desktop", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(fp, buffer, recvedLen, &writeLen, NULL); printf("写入文件长度:%u\n", writeLen); delete[] buffer; WSACleanup(); } } 代码有点乱,还有许多要改的地方,但是大体框架是这样。 运行的时候,客户端能够成功发送文件,服务器端也能正确显示接受的文件大小,然后写入文件却是0,然后就报错,不知道是为什么?
java socket 网络传输文件使网络使用率最大化
局域网传输文件,如何使网络使用率最大化,主要问题是在客户端接收数据写入磁盘时会影响传输效率,有没有好的办法解决呢?
C语言socket建立的简单文件传输问题
# 客户端发送文件 #include<stdio.h> #include<sys/stat.h> #include<sys/socket.h> #include<arpa/inet.h> #include<unistd.h> #include<fcntl.h> #include<string.h> int main(int argc,char **argv) { ssize_t i=1; char buf[512]; int fp; int ret; int socket_client; struct sockaddr_in addr_in; socket_client = socket(AF_INET,SOCK_STREAM,0);//创建套接字 if(socket_client<0){ perror("socket err"); return -1; } addr_in.sin_family = AF_INET; addr_in.sin_port = htons(9001); addr_in.sin_addr.s_addr = inet_addr("192.168.1.77"); ret = connect(socket_client,(struct sockaddr *)&addr_in,sizeof(addr_in));//链接 if(ret<0){ perror("connect err"); return -2; } scanf("%s",buf);//写入文件名 ret = send(socket_client,&buf,sizeof(buf),0);//发送文件名 if(ret<0){ perror("send err"); return -11; } fp = open(buf,O_RDONLY);//打开要发送的文件 if(fp<0){ fprintf(stderr,"open err\n"); return -1; } while(1){ if(i==0){ break; } memset(buf,0,sizeof(buf));//空间清0 i = read(fp,buf,sizeof(buf));//读文件到buf if(i<0){ perror("read err"); return -7; }else if(i==0){ break; } printf("%s\n",buf);//打印一遍用于观察 ret = send(socket_client,buf,sizeof(buf),0);//发送读取到的内容 if(ret<0){ perror("send err"); return -8; } printf("%d\n",ret);//打印发送的大小 sleep(1); } close(socket_client); return 0; } ## 服务器接收文件 #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<sys/stat.h> #include<arpa/inet.h> #include<unistd.h> #include<string.h> #include<stdlib.h> #include<fcntl.h> int main(int aegc,char **argv) { char buf[512]; ssize_t i; int fp; int ret; int socket_sever; int socket_client; struct sockaddr_in addr_in; socket_sever = socket(AF_INET,SOCK_STREAM,0);//定义socket套接字 if(socket_sever<0){ perror("socket err"); return -1; } addr_in.sin_family = AF_INET; addr_in.sin_port = htons(9001); addr_in.sin_addr.s_addr = inet_addr("192.168.1.77"); ret = bind(socket_sever,(struct sockaddr *)&addr_in,sizeof(addr_in));//绑定 if(ret<0){ perror("bind err"); return -2; } ret = listen(socket_sever,5);//监听 if(ret<0){ perror("listen err"); return -3; } socket_client = accept(socket_sever,NULL,NULL);//建立链接 if(socket_client<0){ perror("accept err"); return -4; } ret = recv(socket_client,&buf,sizeof(buf),0);//接收文件明 if(ret<0){ perror("recv err"); return -6; } fp = open(buf,O_WRONLY | O_CREAT | O_APPEND,0644);//创建并打开文件 if(fp<0){ fprintf(stderr,"open err"); return -1; } while(1){ if(i==0){ break; } memset(buf,0,sizeof(buf));//接收空间清0 ret = recv(socket_client,buf,sizeof(buf),0);//接收 if(ret<0){ perror("recv err"); return -6; }else if(ret==0){ break; } printf("%s\n",buf);//打印一遍用于观察 i = write(fp,buf,sizeof(buf));//写入打开的文件 if(i<0){ perror("write err"); return -13; }else if(i==0){ break;} sleep(1); } close(socket_sever); close(socket_client); } 问题出现在写入完成后末尾出现连续的^@^@^@^@^@^@^@^@符号,占用空间
socket套接字文件传输问题,非文本文档无法传输
Linux下使用套接字文件传输,只能传输文本文件,非文本文件读取时无法完全读入,读了很少一部分就停止读入了,求大神解决!
java SOCKET 文件传输 有点问题咨询下!
我写的SOCKET 文件传输带MD5校验,客户端总是多写16位的MD5 服务端代码:(在WRITE完以后,还需要WRITE16位的MD5值) while (len <= 8096 && fis.available() > 0) { byte[] src = new byte[8096]; len = fis.read(src); dos.write(src, 0, len); dos.flush(); } dos.write(fth.getMd5Value()); dos.flush(); 客户端代码: while (rFilelen > 0) { byte[] recvData = new byte[8096]; int len = dis.read(recvData); // 进行SHA1校验 digest.update(recvData, 0, len); fos.write(recvData, 0, len); rFilelen = rFilelen - len; System.out.println(rFilelen); } byte[] md5Value=new byte[16]; dis.readFully(md5Value);
iOS 开发,socket 传输的都是data 类型,怎么知道这个data 的原始类型是图片还是
iOS 开发,socket 传输的都是data 类型,怎么知道这个data 的原始类型是图片还是字符串类型。数据传输用的GCDAsynSocket
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
本篇文章主要讲解 token、session 等用户认证方案的区别并分析常见误区,以及如何通过前后端的配合实现完善的访问拦截,为下一步权限控制的实现打下基础。
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
漫话:什么是平衡(AVL)树?这应该是把AVL树讲的最好的文章了
这篇文章通过对话的形式,由浅入深带你读懂 AVL 树,看完让你保证理解 AVL 树的各种操作,如果觉得不错,别吝啬你的赞哦。 1、若它的左子树不为空,则左子树上所有的节点值都小于它的根节点值。 2、若它的右子树不为空,则右子树上所有的节点值均大于它的根节点值。 3、它的左右子树也分别可以充当为二叉查找树。 例如: 例如,我现在想要查找数值为14的节点。由于二叉查找树的特性,我们可...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
开源并不是你认为的那些事
点击上方蓝字 关注我们开源之道导读所以 ————想要理清开源是什么?先要厘清开源不是什么,名正言顺是句中国的古代成语,概念本身的理解非常之重要。大部分生物多样性的起源,...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
《C++ Primer》学习笔记(六):C++模块设计——函数
专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 https://blog.csdn.net/TeFuirnever/article/details/100700212 —————————————————————————————————————————————————————— 《C++ Primer》习题参考答案:第6章 - C++模块设计——函数 文章目录专栏C+...
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法不过,当我看了源代码之后这程序不到50
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
相关热词 c# 二进制截断字符串 c#实现窗体设计器 c#检测是否为微信 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片
立即提问