点击此处下载源代码
客户端向服务器传递字符串格式1:
//send a header to show it will be followed by a binary file
byte[] header = System.Text.Encoding.UTF8.GetBytes("FILE\r\n"); //换行符的书写格式
ns.Write(header, 0, header.Length);
客户端向服务器传递字符串格式2:
TcpClient tc = new TcpClient();
tc.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), port));
NetworkStream ns = tc.GetStream();
StreamWriter sw = new StreamWriter(ns);
sw.AutoFlush = true;
StreamReader sr = new StreamReader(ns);
sw.WriteLine("PROSPECT"); //第二种传递格式,默认为utf8编码
sw.WriteLine(p.ToString());
string response = sr.ReadLine(); //获得服务器端回应
switch (response)
{
case "PROSPECT_OK":
MessageBox.Show("数据写入成功!");
break;
case "PROSPECT_ERROR":
MessageBox.Show("数据写入失败!");
break;
}
服务器端接收方式:
TcpClient incomingClient = listener.AcceptTcpClient();
NetworkStream ns = incomingClient.GetStream();
StreamReader sr = new StreamReader(ns,System.Text.UTF8Encoding.UTF8);
StreamWriter sw = new StreamWriter(ns, System.Text.UTF8Encoding.UTF8);
String operation = sr.ReadLine(); //服务器端读取数据
w.WriteLine("PROSPECT_OK"); //服务器端写回客户端数据
sw.Flush();
服务器端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Net;
using SocketSample_2;
namespace SocketSample_Server
{
class Program
{
//listen on custom tcp port
private const int port = 38081;
static void Main(string[] args)
{
new Program().ListenerThread();
}
private void ListenerThread()
{
TcpListener listener = new TcpListener(new IPEndPoint(IPAddress.Any, port));
listener.Start();
try
{
while (true)
{
Console.WriteLine("");
Console.WriteLine("等待客户端连接... ... ...");
TcpClient incomingClient = listener.AcceptTcpClient();
//get address of remove device
IPAddress senderAddress = ((IPEndPoint)incomingClient.Client.RemoteEndPoint).Address;
//get a stream to read from the socket
NetworkStream ns = incomingClient.GetStream();
try
{
StreamReader sr = new StreamReader(ns,System.Text.UTF8Encoding.UTF8);
StreamWriter sw = new StreamWriter(ns, System.Text.UTF8Encoding.UTF8);
string operation = sr.ReadLine();
Console.WriteLine("将要执行:"+operation);
if (operation == "exit")
{
Console.WriteLine("程序结束!");
break;
}
if (operation == "PROSPECT")
{
string rawProspect = sr.ReadLine();
string[] fields = rawProspect.Split(',');
if (fields.Length == 3)
{
sw.WriteLine("PROSPECT_OK");
sw.Flush();
Console.WriteLine("PROSPECT_OK");
}
else
{
sw.WriteLine("PROSPECT_ERROR");
sw.Flush();
Console.WriteLine("PROSPECT_ERROR");
}
Prospect receivedProspect = new Prospect();
receivedProspect.Name = fields[0];
receivedProspect.Company = fields[1];
receivedProspect.Number = fields[2];
Console.WriteLine("接收到_PROSPECT:" + senderAddress.ToString()+" "+receivedProspect.ToString());
}
if (operation == "FILE")
{
//filename
string filename = sr.ReadLine();
Console.WriteLine("文件名:"+filename);
//file length
byte[] len = new byte[8];
ns.Read(len, 0, 8);
Int64 fileSize = BitConverter.ToInt64(len, 0);
Console.WriteLine("文件长度:"+fileSize);
//write file
FileStream fs = new FileStream(Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.Personal), filename), FileMode.CreateNew);
byte[] buffer = new byte[4096];
int bytesRead = 0;
do{
bytesRead = ns.Read(buffer, 0, 4096);
fs.Write(buffer, 0, bytesRead);
} while (bytesRead > 0);
fs.Close();
sw.WriteLine("FILE_OK"); (此处应该删掉,因为发送的程序已经关闭了数据流) 2009.10.15日
Console.WriteLine("FILE_OK");
}
}
catch(Exception e)
{
ns.Close();
Console.WriteLine(e.Message + " ERROR");
}
}//end while
}catch{
//transfer failed
Console.WriteLine("Failed");
}
finally
{
//stop the listener
listener.Stop();
}
}//end ListenerThread
}
}
客户端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Net;
namespace SocketSample_2
{
public partial class Form1 : Form
{
//listen on custom tcp port
private const int port = 38081;
public Form1()
{
InitializeComponent();
}
private void button_sendFile_Click(object sender, EventArgs e)
{
//pick a file
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//only perform if file was selected
TcpClient tc = new TcpClient();
tc.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), port));
NetworkStream ns = tc.GetStream();
try
{
//send a header to show it will be followed by a binary file
byte[] header = System.Text.Encoding.UTF8.GetBytes("FILE\r\n");
ns.Write(header, 0, header.Length);
//send the filename
string filename = Path.GetFileName(openFileDialog1.FileName);
header = System.Text.Encoding.UTF8.GetBytes(filename + "\r\n");
ns.Write(header, 0, header.Length);
//send the file length (int64 - 8 bytes)
FileInfo fi = new FileInfo(openFileDialog1.FileName);
byte[] buffer = BitConverter.GetBytes(fi.Length);
ns.Write(buffer, 0, buffer.Length);
//send the file contents
FileStream fs = new FileStream(filename, FileMode.Open);
buffer = new byte[fs.Length];
fs.Read(buffer, 0, (int)fs.Length);
fs.Close();
ns.Write(buffer, 0, buffer.Length);
}
catch (SocketException se)
{
MessageBox.Show(se.NativeErrorCode.ToString() + ": " + se.ToString());
}
finally
{
ns.Close();
tc.Close();
}
MessageBox.Show("文件发送完毕!");
}
}
//send object
private void button_Prospect_Click(object sender, EventArgs e)
{
//create prospect object
Prospect p = new Prospect();
p.Name = "qihuaifeng";
p.Company = "ahnu";
p.Number = "1";
TcpClient tc = new TcpClient();
tc.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), port));
NetworkStream ns = tc.GetStream();
StreamWriter sw = new StreamWriter(ns);
sw.AutoFlush = true;
StreamReader sr = new StreamReader(ns);
try
{
sw.WriteLine("PROSPECT");
sw.WriteLine(p.ToString());
string response = sr.ReadLine();
switch (response)
{
case "PROSPECT_OK":
MessageBox.Show("数据写入成功!");
break;
case "PROSPECT_ERROR":
MessageBox.Show("数据写入失败!");
break;
}
}
catch (SocketException se)
{
MessageBox.Show("Socket Exception trying to send: " + se.ToString());
}
finally
{
ns.Close();
}
}
private void button_Exit_Click(object sender, EventArgs e)
{
TcpClient tc = new TcpClient();
tc.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), port));
NetworkStream ns = tc.GetStream();
StreamWriter sw = new StreamWriter(ns);
sw.AutoFlush = true;
try
{
sw.WriteLine("exit");
MessageBox.Show("服务器已经停止!");
}
catch (SocketException se)
{
MessageBox.Show("Socket Exception trying to send: " + se.ToString());
}
finally
{
ns.Close();
}
}
}
}