C#培训2019-11-15 Socket 实现两个应用之间通信(相同/不同主机之间)

Socket利用TCP/IP通信方法,实现一台主机中两个应用通信,或者多台主机中应用的通信。
引用using System.Net.Sockets; using System.Net;
1、Server端设置:Server端主要是用来监听Client端是否有连接的。范例代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace Serve
{
	class Program
	{
		static void Main( string[] args )
		{
			Socket socket = new Socket(
				AddressFamily.InterNetwork,// ipv4
				SocketType.Stream,// 串流
				ProtocolType.Tcp );// tcp协议,有时候会用udp
			// serve要绑定主机的ip地址
			IPEndPoint endPoint = new IPEndPoint( IPAddress.Any, 5678 );//准备一个端口,IPAddress.Any 表示可能有双网卡,都会绑定
			socket.Bind( endPoint );

			socket.Listen( 100 );//听client连线,100表示同时可以检测100个

			//当client连线后,需要处理。只有连线时,才会执行这一步,
			//又创建一个Socket来执行数据的接受和发送
			Socket acceptSocket = socket.Accept();

			byte[] buffer = new byte[ 100 ];
			
			// 连接上以后如果没有接受到资料,就会停在这里等待,直到接受到长度为100的byte(可以选择自定义长度的重载方法)
			//可以一直resive,上一次resive完后,还是在连接状态
			//常用的是接受一个封包,要解析,接受长度是根据解析封包长度来定
			acceptSocket.Receive( buffer );

			for( int i = 0; i < buffer.Length; i++ ) {
				Console.Write( buffer[i].ToString() );
			}
			// 发送给Client数据
			byte[] SendBuffer = new byte[ 100 ];
			for( int i = 0; i < 100; i++ ) {
				SendBuffer[ i ] = (byte)(i+100);
			}
			acceptSocket.Send( SendBuffer );
			Console.ReadLine();
		}
	}
}

2、Client端设置:Client端主要是用来连接Server端,连接上后可以和Server端相互传输数据。范例代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace Client
{
	class Program
	{
		static void Main( string[] args )
		{
			Socket socket = new Socket(
				AddressFamily.InterNetwork,
				SocketType.Stream,
				ProtocolType.Tcp );
			//IPEndPoint endPoint = new IPEndPoint();
			//socket.Connect( "18.18.90.197", 5678 );//127.0.0.1是本地端连接ip,此处的端口号要与Server端口号相同,IP可以是外网ip也可以是本机ip
			socket.Connect( "127.0.0.1", 5678 );//也是可以的

			// 此时就是这socket和外部连接沟通
			byte[] buffer = new byte[ 100 ];
			for( int i = 0; i < 100; i++ ) {
				buffer[i] = (byte)i;
			}
			socket.Send( buffer );//发送给Server数据
			
			byte[] ReceiveBuffer = new byte[ 100 ];
			socket.Receive( ReceiveBuffer );//接受Server传过来的数据
			for( int i = 0; i < ReceiveBuffer.Length; i++ ) {
				Console.Write( ReceiveBuffer[ i ].ToString() );
			}
			Console.ReadLine();
		}
	}
}

3、注意事项
①当Server端接到连接后,会执行下一步动作,此时若又另一个连接过来,也会连上。因此一般会用逻辑或其他方式(线程)来单独处理每一个连接。
②查看电脑端口情况CMD代码:netstat -na
③Server端和Client端之间发送的数据只能是 byte[],若要发送字串需要编码和解码,如:
            String string1 = "测试数据123测试数据ABC";
            byte[] buffer = new byte[2048];

			//编码后才能发送字符串
            buffer = Encoding.Default.GetBytes(string1);

            Socket socket = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);
            socket.Connect("127.0.0.1", 5678);
            socket.Send(buffer);
            socket.Close();
            MessageBox.Show("发送完毕");
当然同样的接受到的 byte[]也要解码成字符串,才能正常显示,如:
			byte[] buffer = new byte[ 1024 ];
			acceptSocket.Receive( buffer );
			
			// 下面就是利用Encoding.Default.GetString()方法来解码的
			Console.Write( Encoding.Default.GetString( buffer ) );
④若发送的长度较长(eg:100),接收的变量长度较短(eg:10),则会一次性接收不完,下一次遇到acceptSocket.Receive( buffer );的时候会继续接收上一次没接收完的信息,知道把上一次的完全接收完毕。(例如100长度的发送,用10长度接收,需要接收10次,而不是接收不下直接舍去。)
4、一般使用:
①解决线程调用方法传值:调用时如果需要传入参数,可以通过实例化类来避免这件事,如每次都是实例化类,在建构子中传入参数,然后定义字段。并且在建构子中开新的线程。
②解决编码后长度改变:每次编码后,用数组的CopyTo/Clone方法浅拷贝到另一个固定长度的buffer来装,这样就能保证发送的长度固定了。
③接收固定长度,为了保证每次Receive的长度为固定长度,找到方法的定义,public int Receive( byte[] buffer );,发现返回值为:已经接收的长度。(一般情况下,如果发送的长度等于接收的长度,并且发送是一次性发送完的不会有接收不满的情况)可以利用这个返回值,来保证接收到固定长度才停止接收。
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: #提问者没有完整的问题,无法给出全面的回答,请完善问题# 如果您要问的是如何使用Python和Unity进行Socket通信,那么我可以为您提供一些信息。Socket通信是指通过网络连接在不同的计算机上进行数据传输的过程。Python和Unity可以通过Socket协议实现实时的数据传输和通信。 对于Python和Unity之间Socket通信,Python负责服务器端,Unity负责客户端。Python服务器将数据发送到Unity客户端,Unity客户端接收并解析数据。最常用的Socket协议是TCP(Transmission Control Protocol)协议,它提供了单一的连接,并将数据包使用特殊的数据结构进行编码和解码。 在开始使用Python和Unity进行Socket通信之前,需要安装Python的Socket模块和Unity的网络功能模块。然后,需要编写Python服务器和Unity客户端的代码,实现数据的发送和接收。 Python Socket模块是Python用于网络编程的核心模块。它提供了内置的套接字对象,可用于创建和操作Socket。在此基础上,可以编写一个Python服务器端程序,并绑定到IP地址和端口上。 Unity客户端使用C#,其自带的网络功能模块可以用于发送和接收数据。在Unity中,需要创建网络Socket连接,并进行连接、发送和接收操作。 总的来说,Python和Unity之间Socket通信需要使用TCP协议,并需要编写Python服务器和Unity客户端的代码,才能实现数据的实时传输和通信。在实际工程中,还需要考虑数据格式、安全性等问题。 ### 回答2: #Python-Unity-Socket通信:Unity (C#)的实现 Python-Unity-Socket通信可以让Python代码与Unity (C#)代码实现良好的互动。通过Socket通信,Python和Unity都可以发送和接收网络数据,实现各种场景和功能。 实现Python-Unity Socket通信的步骤如下: 1. 在Python中建立Socket服务器(Server),等待Unity连接 2. 在Unity中建立Socket客户端(Client),连接到Python Socket服务器 3. Python和Unity互相发送和接收数据 在Python中,建立Socket服务器的代码如下: ``` import socket host = '127.0.0.1' port = 8888 s = socket.socket() s.bind((host, port)) s.listen(1) conn, addr = s.accept() print("连接地址:" + str(addr)) while True: data = conn.recv(1024).decode() if not data: break print("接收数据:" + data) conn.sendall(data.encode()) conn.close() ``` 在Unity中,建立Socket客户端的代码如下: ``` using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Net.Sockets; using System.Net; using System; public class SocketClient : MonoBehaviour { public string host = "127.0.0.1"; public int port = 8888; private TcpClient client; // Use this for initialization void Start () { try { client = new TcpClient(); client.Connect(host, port); } catch (Exception e) { Debug.Log(e); } string message = "Hello Python"; byte[] data = System.Text.Encoding.UTF8.GetBytes(message); NetworkStream stream = client.GetStream(); stream.Write(data, 0, data.Length); data = new byte[1024]; string responseData = string.Empty; int bytes = stream.Read(data, 0, data.Length); responseData = System.Text.Encoding.UTF8.GetString(data, 0, bytes); Debug.Log("收到服务器消息:" + responseData); stream.Close(); client.Close(); } } ``` 以上代码实现了Unity向Python发送一条消息,并接收Python回传的消息。 Python和Unity之间还可以通过Socket发送和接收其他类型的数据,如音频、视频等。需要注意的是,Python和Unity发送和接收数据的格式需要保持一致,可以使用Json、Protobuf等数据格式来统一。 ### 回答3: # 应该题目描述不太准确,这里按照理解给出回答 python-unity-socket-communication,是指使用Python语言和Unity游戏引擎之间进行网络Socket通信。 具体实现中,需要在Unity中编写C#代码,通过Socket连接Python服务器,实现网络通信。 在Unity中,首先需要使用Socket创建一个客户端连接到Python服务器,并通过该连接向Python服务器发送请求和接收响应。同时,需要编写代码来解析Python服务器返回的数据,以便Unity游戏引擎正确地使用它们。 在Python服务器中,需要编写Socket服务器程序,以便监听来自Unity客户端的请求,并对其做出响应。在响应Unity客户端请求时,需要将Python语言中的数据格式转换为Unity游戏引擎所需的格式。 总之,Python-Unity-Socket通信是一种常用且强大的网络通信方式,可以帮助Unity游戏开发人员高效地与Python服务器进行通信,以实现更为复杂的游戏功能和应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值