文件上傳socket
① Socket文件傳輸問題
這就由你自己制定標准了,客戶端可以每次接收後,判斷buffer中的內容,如果為「ok」那就不寫,並且關閉文件就好了。
② c# c/s結構Socket上傳文件的代碼
以流的形式寫
int
port
=
1234;
int
port
=
1234;
IPAddress
ip
=
IPAddress.Parse("127.0.0.1");
socket
=
new
Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint
iep
=
new
IPEndPoint(ip,port);
//socket.Blocking
=
false;
socket.Bind(iep);
socket.Listen(10);
Console.WriteLine("start......");
try
{
for
(int
i
=
0;
i
<
10;i++
)
{
}
}
catch
{
Console.WriteLine("異常!");
socket.Close();
}
接收端
private
void
Receive(Socket
socket)
{
NetworkStream
ns
=
new
NetworkStream(socket);
FileStream
fs
=
new
FileStream("c:\\file.txt",
FileMode.OpenOrCreate);
bool
isRead
=
true;
while
(isRead)
{
int
count
=
ns.Read(this._receiveBuf,
0,
this._receiveBuf.Length);
int
datanum
=
0;
datanum
=
BitConverter.ToInt32(this._receiveBuf,
0);
//從buffer中的前4個位元組讀出count
if
(datanum
>
0)
//確定每次要接受多少位元組數
{
fs.Write(this._receiveBuf,
4,
datanum);
}
else
//如果接受位元組數為0
就推出
{
isRead
=
false;
}
}
this.txtFile.Text
=
"文件傳輸成功";
fs.Close();
}
---------------------
發送端
private
void
btSend_Click(object
sender,
System.EventArgs
e)
{
if
(this._isConnect)
{
_ns
=
_tc.GetStream();
string
path
=
this.txtPath.Text.Trim();
FileStream
fs
=
new
FileStream(path,
FileMode.Open);
int
sendCount
=
0;
byte[]
countbuffer
=
null;
byte[]
clientbuffer
=
new
byte[1004];
while
(sendCount
<
fs.Length
&&
_ns.CanWrite)
{
int
count
=
fs.Read(_sendBuf,
0,
_sendBuf.Length);
//讀出要發送的數據
countbuffer
=
BitConverter.GetBytes(count);
countbuffer.CopyTo(clientbuffer,0);
_sendBuf.CopyTo(clientbuffer,
4);
this._ns.Write(clientbuffer,
0,
4
+
count);
//寫入網路流
sendCount
+=
count;
}
countbuffer
=
BitConverter.GetBytes(0);
//發送完文件後
發送count
=
0
this._ns.Write(countbuffer,
0,
countbuffer.Length);
//使接收端停止
_ns.Close();
fs.Close();
}
}
http://hi..com/lqj1112/blog/item/9a0fd21638c6461e962b4336.html
http://topic.csdn.net/u/20080514/23/23e325fc-7040-4c0b-bb6c-d1223704397c.html
③ java使用socket文件上傳
for(int size=0;size!=-1;size=fis.read(buf)){
output.write(buf,0,size);
output.flush();
}
for(int size=0;size!=-1;size=fis.read(buf))
在buf中讀取位元組;當buf沒有內容了,返回的-1;在這個之前,一直在循環;
output.write(buf,0,size);
output.flush();
把buf中道0開始到size個位元組的內容寫入輸出流緩沖中
並用 flush()確認發送到輸出流中了;
我的意見是output.write(buf,0,size);
改為output.write(buf);
你接受數據部分代碼怎麼寫的,是不是size等於一個大於1024的整數了而出錯
④ 怎樣用socket實現點對點的文件傳輸
在兩台計算機傳輸文件之前,必需得先有一台計算機建立套接字連接並綁定一個固定得埠,並在這個埠偵聽另外一台計算機的連接請求。
socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
socket.Blocking = true ;
IPEndPoint computernode1 = new IPEndPoint(serverIpadress, 8080);
socket.Bind(computernode1);
socket.Listen(-1);
當有其他的計算機發出連接請求的時候,被請求的計算機將對每一個連接請求分配一個線程,用於處理文件傳輸和其他服務。
while ( true )
{
clientsock = socket.Accept();
if ( clientsock.Connected )
{
Thread tc = new Thread(new ThreadStart(listenclient));
tc.Start();
}
}
下面的代碼展示了listenclient方法是如何處理另外一台計算機發送過來的請求。首先並對發送過來的請求字元串作出判斷,看看是何種請求,然後決定相應的處理方法。
void listenclient()
{
Socket sock = clientsock ;
try
{
while ( sock != null )
{
byte[] recs = new byte[32767];
int rcount = sock.Receive(recs,recs.Length,0) ;
string message = System.Text.Encoding.ASCII.GetString(recs) ;
//對message作出處理,解析處請求字元和參數存儲在cmdList 中
execmd=cmdList[0];
sender = null ;
sender = new Byte[32767];
string parm1 = "";
//目錄列舉
if ( execmd == "LISTING" )
{
ListFiles(message);
continue ;
}
//文件傳輸
if ( execmd == "GETOK" )
{
cmd = "BEGINSEND " + filepath + " " + filesize ;
sender = new Byte[1024];
sender = Encoding.ASCII.GetBytes(cmd);
sock.Send(sender, sender.Length , 0 );
//轉到文件下載處理
DownloadingFile(sock);
continue ;
}
}
}
catch(Exception Se)
{
string s = Se.Message;
Console.WriteLine(s);
}
}
至此,基本的工作已經完成了,下面我們看看如何處理文件傳輸的。
while(rdby < total && nfs.CanWrite)
{
//從要傳輸的文件讀取指定長度的數據
len =fin.Read(buffed,0,buffed.Length) ;
//將讀取的數據發送到對應的計算機
nfs.Write(buffed, 0,len);
//增加已經發送的長度
rdby=rdby+len ;
}
從上面的代碼可以看出是完成文件轉換成FileStream 流,然後通過NetworkStream綁定對應的套節子,最後調用他的write方法發送到對應的計算機。
我們再看看接受端是如何接受傳輸過來的流,並且轉換成文件的:
NetworkStream nfs = new NetworkStream(sock) ;
try
{
//一直循環直到指定的文件長度
while(rby < size)
{
byte[] buffer = new byte[1024] ;
//讀取發送過來的文件流
int i = nfs.Read(buffer,0,buffer.Length) ;
fout.Write(buffer,0,(int)i) ;
rby=rby+i ;
}
fout.Close() ;
從上面可以看出接受與發送恰好是互為相反的過程,非常簡單。
至此,單方向的文件傳輸就完成了,只需要在每個對等的節點上同時實現上面的發送和接受的處理代碼就可以做到互相傳輸文件了。
⑤ Socket網路通信怎麼往伺服器上傳數據
//上傳文件
Socket socket = new Socket("192.168.0.240", 7878);
OutputStream outputStream = socket.getOutputStream();
String head = "Content-Length=" + audioFile.length()
+ ";filename=" + audioFile.getName()
+ ";sourceid=\r\n";
outputStream.write(head.getBytes());
PushbackInputStream inStream = new PushbackInputStream(
socket.getInputStream());
String response = StreaTool.readLine(inStream);
String[] items = response.split(";");
String position = items[1]
.substring(items[1].indexOf("=") + 1);
RandomAccessFile fileOutStream = new RandomAccessFile(
audioFile, "r");
fileOutStream.seek(Integer.valueOf(position));
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fileOutStream.read(buffer)) != -1)
{
outputStream.write(buffer, 0, len);
}
fileOutStream.close();
outputStream.close();
socket.close();
audioFile.delete();
} catch (UnknownHostException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
⑥ socket 傳送文件
此程序所佔篇幅太大,涉及伺服器和客戶端兩個程序。費時間了。
主要思想就那麼一點:基本socket編程,再加上文件操作不就行了。伺服器端接到客戶端發送的內容後,將緩沖區內的東西存到本地文件1.txt然後再將應答存儲在2.txt文件中,同時將2.txt的內容發送回客戶端。客戶端接到後,將收到的東西存到客戶端本地的2.txt中後,再向伺服器發送應答。這東西的本質不是發送文件,而是接受信息並存儲到本地的txt中,希望你理解
⑦ Socket通信能不能發送文件
當然可以咯,socket是套接字,運行在網路層(IP)以及傳輸層上,顯然是可以傳輸文件的咯,應用層使用的各種TCP,ftp,UDP服務均可封裝在套接字之上,所以顯然是可以的咯。
⑧ 請教socket文件傳輸問題
關閉?Receive最好開辟一個線程,來不斷循環不斷偵聽每次發來的數據,你的Send傳遞的數據如果為二進制,最好分成兩次傳遞,第一次傳遞二進制數據的長度,第二次傳遞數據,Receive接收的第一次數據得到二進制數據長度後,定義位元組數組的長度,第二次向位元組數組傳遞數據!你不是關閉,你是不是將傳遞與接收寫在一起了?
⑨ 要通過(socket)來傳輸文件這是什麼意思
SOCKET用於在兩個基於TCP/IP協議的應用程序之間相互通信。中文有的稱為套接字,你可以理解為一個插座和插頭,兩者匹配才能進行數據通信。 SOCKET最早出現在UNIX系統中,是UNIX系統主要的信息傳遞方式。在WINDOWS系統中,SOCKET稱為WINSOCK。
SOCKET有兩個基本概念:客戶方和服務方。當兩個應用之間需要採用SOCKET通信時,首先需要在兩個應用之間(可能位於同一台機器,也可能位於不同的機器)建立SOCKET連接,發起呼叫連接請求的一方為客戶方,接受呼叫連接請求的一方成為服務方。客戶方和服務方是相對的,同一個應用可以是客戶方,也可以是服務方。
在客戶方呼叫連接請求之前,它必須知道服務方在哪裡。所以需要知道服務方所在機器的IP地址或機器名稱,如果客戶方和服務方事前有一個約定就好了,這個約定就是PORT(埠號)。也就是說,客戶方可以通過服務方所在機器的IP地址或機器名稱和埠號唯一的確定方式來呼叫服務方。在客戶方呼叫之前,服務方必須處於偵聽狀態,偵聽是否有客戶要求建立連接。一旦接到連接請求,服務方可以根據情況建立或拒絕連接。連接方式有兩種,同步方式(Blocking)和(noBlocking).
客戶方發送的消息可以是文本,也可以是二進制信息流。當客戶方的消息到達服務方埠時,會自動觸發一個事件(event),服務方只要接管該事件,就可以接受來自客戶方的消息了。
⑩ 為什麼上傳文件到空間中時總是出現打開數據 socket
問題出現原因:FTP客戶端程序設置問題,客戶上網線路問題,ftp伺服器端問題。 處理方法:建議客戶使用CUTPFTP軟體來上傳客戶的網頁,在「FTP主機地址處」最好填寫IP地址,如果客戶上傳時提示socket錯誤的話,請您檢查一下您使用軟體的編輯菜單下的連接中防火牆里是否有一個使用了pasv模式,如果選中的話,您把此選項取消即可連接主機。 2、FTP時已經通過身份驗證,但總列不出目錄或總是顯示建立數據 socket 失敗 問題出現原因:您使用的上傳軟體的FTP客戶端程序不應該選用PASV mode和firewall setting 3、為什麼無法上傳,提示連接時找不到主機? 首先請您檢查一下您的域名是否做過域名解析,檢測方法:您可以在DOS提示符下輸入ping域名如果可以ping通的話,則您可以在FTP軟體中「FTP主機地址處」填寫您的域名,如果ping不通的話,則您需要在「FTP主機地址處」填寫您主機的IP地址。 注意:我們建議您使用IP地址上傳頁面,同時,某些地區的撥號上網的169對ftp有限制。所以請您最好更換上網方式後在進行測試。 4、為什麼無法上傳,提示密碼不對? 請查看您的登陸名密碼填寫是否正確,因為如果密碼是復制的話,可能會復制出空格。另外,您要看一下您在ftp登陸時選擇的登陸類型是否是普通。 如果您把密碼忘記的話,您可以修改:用戶管理中心我的主機選擇對應域名並點擊主機詳情基本FTP賬號更改密碼 如果此處的密碼也無法登陸,請您發傳真到中國易動網技術部,請註明您的ID,您的主機域名,您的要求,您的聯系方式、並加蓋公章(個人附身份證復印件),我們收到後會盡快為您辦理。