JJChat第二课时---Socket

xx****st UID.1130055
2016-07-22 发表

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
以TCP协议为例:
客户端连接:
async private void SocketConnetct()
{
StreamSocke socket = new StreamSocket();

HostName hostName = new HostName("127.0.0");//ip
string serverPort = "12345";//端口port
await socket.ConnectAsync(hostName, serverPort);

using (DataWriter writer = new DataWriter(socket.OutputStream))
{
string content ="主机你好!我是客户端 ";
reqtb.Text = content;
writer.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
// 计算长度
uint len = writer.MeasureString(content);
// 写入长度
writer.WriteUInt32(len);
// 再写内容
writer.WriteString(content);

// 提交数据
await writer.StoreAsync();
}

DataReader DataReader reader = new DataReader(socket.InputStream); //实例化reader对象,并以StreamSocket的输入流为reader的来源
reader.InputStreamOptions = InputStreamOptions.Partial; //采用异步方式
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
while (true) //循环读取消息
{
await reader.LoadAsync(sizeof(uint));
var ss = reader.ReadString(reader.UnconsumedBufferLength);
var len = reader.ReadUInt32();
// 读内容
await reader.LoadAsync(len);


string response = reader.ReadString(reader.UnconsumedBufferLength);

await Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
{
//更新UI
// restb.Text += response;

});
}

}
服务端侦听:
async private void CreatSocket()
{

StreamSocketListener listener = new StreamSocketListener();
listener.ConnectionReceived += Connection_Received;
await listener.BindServiceNameAsync("port");
}
private async void Connection_Received(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
{
// 获取用于通信的socket
StreamSocket socket = args.Socket;

DataReader DataReader reader = new DataReader(socket.InputStream); //实例化reader对象,并以StreamSocket的输入流为reader的来源
reader.InputStreamOptions = InputStreamOptions.Partial; //采用异步方式
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
while (true) //循环读取消息
{
await reader.LoadAsync(sizeof(uint));
var ss = reader.ReadString(reader.UnconsumedBufferLength);
var len = reader.ReadUInt32();
// 读内容
await reader.LoadAsync(len);


string response = reader.ReadString(reader.UnconsumedBufferLength);

await Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
{
//更新UI
// restb.Text += response;

});
}


// 向客户端发送字符串:

using (DataWriter writer = new DataWriter(socket.OutputStream))
{
string content = "你好客户端!我是服务器。";
writer.UnicodeEncoding =Windows.Storage.Streams.UnicodeEncoding.Utf8;
// 计算长度
uint len = writer.MeasureString(content);
// 写入长度
writer.WriteUInt32(len);
// 再写内容
writer.WriteString(content);
// 提交数据
await writer.StoreAsync();
}
}

这样,一个简单的聊天程序就完成了;需要关闭连接时把socket,reader,writer全部dispos就行了。
UDP和TCP大同小异(DatagramSocket),不过UDP可以不用连接,直接发送。至于TCP和UDP的区别我这里就不详细讲了。
//注意! uwp不允许在同一台机器上连接,所以必须要两台win10设备进行测试

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
指****律 UID.1181238
2016-07-22 使用 Lumia 1020 回复

可以参考。VS下的东西?

tmp00000 UID.995403
2016-07-22 回复

网络回环用Fiddler可以搞定。没必要调试的时候找两台。

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报