『壹』 C# Winform 多线程 SOCKET 文件上传,下载
这可是很麻烦的,自己到网上找吧
『贰』 python socket 网络编程 ,服务器端发的文件大小跟客户端接受打文件大小不一样 这是什么原因
很简单,你说让服务端发1024大小他就发1024大小吗,不一定tcp协议他会把内容先丢缓存再缓存拿,假设你让服务器发1024大小他有时候会分好几次发,你只要实时读取客户端接收文件大小就好了,和服务端发过来文件大小进行比较然后考虑后面要不要继续接收
『叁』 socket下载网页时网络阻塞
这个问题涉及到HTTP协议。估计默认是以KeepAlive的方式处理HTTP请求的,就是说服务器端会保持连接一段时间,以便重新利用该连接接受新的HTTP请求。解决的办法是 1. 发送HTTP请求的时候主动要求不使用KeepAlive;2. 或者对服务器返回的内容做分析,根据返回的头部信息能够知道数据的长度或者数据块的大小和数目(如果是以Transfer-Encoding: chunked的方式返回),这样就能确定是否已经接受了所有的数据,然后进行主动close().另外补充一下: 自己写socket程序下载网页会涉及到很多问题,比如有些服务器是把数据压缩后返回的,比如google的有些服务,你还需要对它进行解压还原。因此,建议使用一些已有的库进行开发会比较方便一点,推荐使用libcurl来处理HTTP/FTP。
『肆』 怎样通过java实现服务器上文件下载
用HttpClient(commons httpclient)包,模拟一个Get请求,发送到网址172.16.30.230/文件地址。这个文件地址不能是E/Map/123.txt,必须是暴露在服务专器属中的应用里的。就像你写的应用里的一个jsp页面的目录。成功发送get请求后,就会得到response,里面有流。就是你下载的文件,然后可以通过FileOutputStream,指定你输出目录,写到磁盘上。
『伍』 关于用JAVA的SOCKET传输文件
点对点传输文件/*import java.io.*;import java.net.*;import java.util.*;*/private HttpURLConnection connection;//存储连接 private int downsize = -1;//下载文件大小,初始值为-1 private int downed = 0;//文加已下载大小,初始值为0 private RandomAccessFile savefile;//记录下载信息存储文件 private URL fileurl;//记录要下载文件的地址 private DataInputStream fileStream;//记录下载的数据流try{ /*开始创建下载的存储文件,并初始化值*/ File tempfileobject = new File("h:\\webwork-2.1.7.zip"); if(!tempfileobject.exists()){ /*文件不存在则建立*/ tempfileobject.createNewFile(); } savefile = new RandomAccessFile(tempfileobject,"rw"); /*建立连接*/ fileurl = new URL("https://webwork.dev.java.net/files/documents/693/9723/webwork-2.1.7.zip"); connection = (HttpURLConnection)fileurl.openConnection(); connection.setRequestProperty("Range","byte="+this.downed+"-"); this.downsize = connection.getContentLength(); //System.out.println(connection.getContentLength()); new Thread(this).start(); } catch(Exception e){ System.out.println(e.toString()); System.out.println("构建器错误"); System.exit(0); } public void run(){ /*开始下载文件,以下测试非断点续传,下载的文件存在问题*/ try{ System.out.println("begin!"); Date begintime = new Date(); begintime.setTime(new Date().getTime()); byte[] filebyte; int onecelen; //System.out.println(this.connection.getInputStream().getClass().getName()); this.fileStream = new DataInputStream( new BufferedInputStream( this.connection.getInputStream())); System.out.println("size = " + this.downsize); while(this.downsize != this.downed){ if(this.downsize – this.downed > 262144){//设置为最大256KB的缓存 filebyte = new byte[262144]; onecelen = 262144; } else{ filebyte = new byte[this.downsize – this.downed]; onecelen = this.downsize – this.downed; } onecelen = this.fileStream.read(filebyte,0,onecelen); this.savefile.write(filebyte,0,onecelen); this.downed += onecelen; System.out.println(this.downed); } this.savefile.close(); System.out.println("end!"); System.out.println(begintime.getTime()); System.out.println(new Date().getTime()); System.out.println(begintime.getTime() – new Date().getTime()); } catch(Exception e){ System.out.println(e.toString()); System.out.println("run()方法有问题!"); }}/***//FileClient.javaimport java.io.*;import java.net.*;public class FileClient {public static void main(String[] args) throws Exception {//使用本地文件系统接受网络数据并存为新文件File file = new File("d:\\fmd.doc");file.createNewFile();RandomAccessFile raf = new RandomAccessFile(file, "rw");// 通过Socket连接文件服务器Socket server = new Socket(InetAddress.getLocalHost(), 3318);//创建网络接受流接受服务器文件数据InputStream netIn = server.getInputStream();InputStream in = new DataInputStream(new BufferedInputStream(netIn));//创建缓冲区缓冲网络数据byte[] buf = new byte[2048];int num = in.read(buf);while (num != (-1)) {//是否读完所有数据raf.write(buf, 0, num);//将数据写往文件raf.skipBytes(num);//顺序写文件字节num = in.read(buf);//继续从网络中读取文件}in.close();raf.close();}}//FileServer.javaimport java.io.*;import java.util.*;import java.net.*;public class FileServer {public static void main(String[] args) throws Exception {//创建文件流用来读取文件中的数据File file = new File("d:\\系统特点.doc");FileInputStream fos = new FileInputStream(file);//创建网络服务器接受客户请求ServerSocket ss = new ServerSocket(8801);Socket client = ss.accept();//创建网络输出流并提供数据包装器OutputStream netOut = client.getOutputStream();OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut));//创建文件读取缓冲区byte[] buf = new byte[2048];int num = fos.read(buf);while (num != (-1)) {//是否读完文件doc.write(buf, 0, num);//把文件数据写出网络缓冲区doc.flush();//刷新缓冲区把数据写往客户端num = fos.read(buf);//继续从文件中读取数据}fos.close();doc.close();}}*/
『陆』 socket通信
使用线程开多个监听!
『柒』 基于JAVA socket的服务器客户端编程
要完成这个工作,需要完成三个部分的工作,以下依次说明:一、建立服务器类Java中有一个专门用来建立Socket服务器的类,名叫ServerSocket,可以用服务器需要使用的端口号作为参数来创建服务器对象。ServerSocket server = new ServerSocket(9998)这条语句创建了一个服务器对象,这个服务器使用9998号端口即在端口9998上注册服务,这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的,另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。当一个客户端程序建立一个Socket连接,所连接的端口号为9998时,服务器对象server便响应这个连接,并且server.accept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。Socket incoming = server.accept() ; // 监听窗口,等待连接进而得到输入流和输出流,并进行封装BufferedReader in = new BufferedReader(newInputStreamReader(incoming.getInputStream()));/*当读取文件时,先把内容读到缓存中,当调用in.readLine()时,再从缓存中以字符的方式读取数据(以下简称“缓存字节读取方式”)。*/PrintWriter ut = new PrintWriter(incoming.getOutputStream(),true);随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。在所有通讯结束以后应该关闭这两个数据流,关闭的顺序是先关闭输出流,再关闭输入流,即使用out.close();in.close();二、建立客户端代码相比服务器端,客户端要简单一些,客户端只需用服务器所在机器的ip以及服务器的端口作为参数创建一个Socket对象。得到这个对象后,就可以用"建立服务器"部分介绍的方法实现数据的输入和输出。Socket socket = new Socket("168.160.12.42",9998);或:Socket socket = new Socket(InetAddress.getLocalHost(),5678); // 向主机名为InetAddress.getLocalHost()的服务器申请连接客户机必须知道有关服务器的IP地址,对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供,它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out = new PrintWriter(socket.getOutputStream(),true); 以上的程序代码建立了一个Socket对象,这个对象连接到ip地址为168.160.12.42的主机上、端口为9998的服务器对象。并且建立了输入流和输出流,分别对应服务器的输出和客户端的写入。三、实例分析服务方:import java.io.*; import java.net.*; public class MyServer { public static void main(String[] args) throws IOException{ ServerSocket server=new ServerSocket(5678); //在端口5678上注册服务 Socket client=server.accept(); // 监听窗口,等待连接 BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));BufferedReader serverInput=new BufferedReader(new InputStreamReader(System.in)); PrintWriter ut=new PrintWriter(client.getOutputStream()); while(true){ String str=in.readLine(); //// 读取从client传来的数据信息 str = serverInput.readLine(); // 读取用户键盘输入的字符串 System.out.println(str); //服务器控制台输出数据信息 out.println("has receive…."); //服务器向客户端发送信息:has receive…. out.flush(); if(str.equals("end")) break; } client.close(); } } 这个程序的主要目的在于服务器不断接收客户机所写入的信息只到,客户机发送"End"字符串就退出程序,并且服务器也会做出"Receive"为回应,告知客户机已接收到消息。 客户机代码:import java.net.*; import java.io.*; public class Client{ static Socket server; public static void main(String[] args)throws Exception{ server=new Socket(InetAddress.getLocalHost(),5678); // 向主机名为InetAddress.getLocalHost()的服务器申请连接 BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream())); //客户端建立输入流并进行封装 PrintWriter ut=new PrintWriter(server.getOutputStream()); BufferedReader wt=new BufferedReader(new InputStreamReader(System.in)); //客户端从键盘输入信息 while(true){ String str=wt.readLine(); //客户端读取(获得)键盘的字符串 String str1=in.readLine(); // 从服务器获得字符串 out.println(str); //客户端向服务器发送信息 out.flush(); if(str.equals("end")){ break; } System.out.println(in.readLine()); } server.close(); } } 客户机代码则是接受客户键盘输入,并把该信息输出,然后输出"End"用来做退出标识。 这个程序只是简单的两台计算机之间的通讯,如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的。那么多个客户端如何实现呢? 其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身,而服务器通过accept方法就是同意和客户建立通讯.这样当客户建立Socket的同时。服务器也会使用这一根连线来先后通讯,那么既然如此只要我们存在多条连线就可以了。那么我们的程序可以变为如下: 服务器:import java.io.*; import java.net.*; public class MyServer { public static void main(String[] args) throws IOException{ ServerSocket server=new ServerSocket(5678); while(true){ Socket client=server.accept(); BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter ut=new PrintWriter(client.getOutputStream()); while(true){ String str=in.readLine(); System.out.println(str); out.println("has receive…."); out.flush(); if(str.equals("end")) break; } client.close(); } } } 这里仅仅只是加了一个外层的While循环,这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的"End"消息.那么现在就实现了多客户之间的交互了。但是.问题又来了,这样做虽然解决了多客户,可是是排队执行的。也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互,无法做到同时服务,那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了。所以线程是最好的解决方案。 那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和网络连线取得联系。然后由线程来执行刚才的操作,要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了.而要执行线程就必须重写run方法,而run方法所做的事情就是刚才单线程版本main所做的事情,因此我们的程序变成了这样:import java.net.*; import java.io.*; public class MultiUser extends Thread{ private Socket client; public MultiUser(Socket c){ this.client=c; } public void run(){ try{ BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter ut=new PrintWriter(client.getOutputStream()); //Mutil User but can't parallel while(true){ String str=in.readLine(); System.out.println(str); out.println("has receive…."); out.flush(); if(str.equals("end")) break; } client.close(); }catch(IOException ex){ }finally{ } } public static void main(String[] args)throws IOException{ ServerSocket server=new ServerSocket(5678); while(true){ //transfer location change Single User or Multi User MultiUser mu=new MultiUser(server.accept()); mu.start(); } } } 我的类直接从Thread类继承了下来.并且通过构造函数传递引用和客户Socket建立了联系,这样每个线程就有了。一个通讯管道.同样我们可以填写run方法,把之前的操作交给线程来完成,这样多客户并行的Socket就建立起来了。
『捌』 ubuntu 服务器安装socket需要安装啥
安装tftp服务器:需要安装xinetd、tftp、tftp-server3软件1、如果能上网,通过yum安装:sudo yum install xinetdsudo yum install tftpsudo yum install tptp-server2、如果不能上网,可以直接安装提供的rpm包:sudo rpm -ivh xinetd-2.3.14-18.fc9.i386.rpmsudo rpm -ivh tftp-0.48-3.fc9.i386.rpmsudo rpm -ivhtftp-server-0.48-3.fc9.i386.rpm配置tftp服务器:修改/etc/xinetd.d/tftp文件disable=yes 改为 disable=noserver_args=-s /var/lib/tftpboot 改为 server_args=-s /tftpboot/ -c 修改/etc/sysconfig/selinux文件 SELINUX=disabled (系统默认是enforcing)要改成disabled chmod 777 /tftpboot 修改/tftpboot文件夹的权限 启动 service xinetd restart 查看tftp服务是否开启: netstat -a | grep tftp显示结果为 udp 0 0 *:tftp *:* 表示服务已经开启,tftp配置成功 把openwrt-ar71xx-wp543-squashfs-4M-factory.img 文件复制到目录/tftpboot 下 在目录/home/x(目录名)下: 启动tftp服务器 sudo in.tftpd -l /tftpboottftp 192.168.0.26(本机的IP地址)tftp>get a(文件名) 在服务器上下载文件 tftp>put a(文件名) 上传文件到服务器上 tftp>q 退出 启动tftp服务器:service tftpd-hpa stop 停止tftp服务器service tftpd-hpa start 开启tftp服务器service tftpd-hpa stutus 查看tftp运行状态service tftpd-hpa restart 重启tftp服务器 (注意:文件传输后文件的权限会发生变化) 进入TFTP操作: connect:连接到远程tftp服务器mode:文件传输模式put:上传文件 get:下载文件 quit:退出verbose:显示详细的处理信息 tarce:显示包路径 status:显示当前状态信息binary:二进制传输模式ascii:ascii 传送模式 rexmt:设置包传输的超时时间timeout:设置重传的超时时间help:帮助信息? :帮助信息 -g 表示下载文件 (get)-p 表示上传文件 (put)-l 表示本地文件名 (local file)-r 表示远程主机的文件名 (remote file)例如,要从远程主机192.168.1.2上下载 embedexpert,则应输入以下命令:tftp -g -r embedexpert 192.168.1.2 出现的一些问题及原因(解决方法): 1、Transfer time out. tftpd服务没有启动2、Error code 0:Permission denied可能是由SELinux造成的,在FC3和FC3以后的FC版本中SELinux默认的都是开启的,现在要关掉它。 修改文件/etc/sysconfig/selinux,设定SELINUX=disabled,然后重启电脑即可或者 执行命令system-config-securitylevel打开“安全级别配置”对话框,将SELinux(S)选项中“强制”改为“允许”3、Error code 1:File not found指定的文件夹不存在;或tftpd启动参数中没有指定-c选项,允许上传文件 4、Error code 2:Only absolute filenames allowed /etc/xinetd.d/tftpd文件的设置没设好,只需要将server_args= 改为你自己设定 的服务器文件夹就行了 5、Error code 2:Access violation上传的文件要有相应的可读写(覆盖)的权限才能上传,要对文件的权限进行修改 chmod 777 a(文件名)