这个例子只是简单实现了如何使用 socket 类实现面向连接的通信。
注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中的使用程序。在这个例子中,实际上还有很多问题没有解决,如消息边界问题、端口号是否被占用、消息命令的解析问题等。。
下面是两个程序的代码,(两个程序均为控制台程序)
先发服务端的(server)完整代码如下:
引入命名空间:
using system.net.sockets;
using system.net;
using system.threading;
完整代码如下:
namespace socketserver
{
class program
{
private static byte[] result = new byte[1024];
private static int myprot = 8885; //端口
static socket serversocket;
static void main(string[] args)
{
//服务器ip地址
ipaddress ip = ipaddress.parse("127.0.0.1");
serversocket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);
serversocket.bind(new ipendpoint(ip, myprot)); //绑定ip地址:端口
serversocket.listen(10); //设定最多10个排队连接请求
console.writeline("启动监听{0}成功", serversocket.localendpoint.tostring());
//通过clientsoket发送数据
thread mythread = new thread(listenclientconnect);
mythread.start();
console.readline();
}
/// <summary>
/// 监听客户端连接
/// </summary>
private static void listenclientconnect()
{
while (true)
{
socket clientsocket = serversocket.accept();
clientsocket.send(encoding.ascii.getbytes("server say hello"));
thread receivethread = new thread(receivemessage);
receivethread.start(clientsocket);
}
}
/// <summary>
/// 接收消息
/// </summary>
/// <param name="clientsocket"></param>
private static void receivemessage(object clientsocket)
{
socket myclientsocket = (socket)clientsocket;
while (true)
{
try
{
//通过clientsocket接收数据
int receivenumber = myclientsocket.receive(result);
console.writeline("接收客户端{0}消息{1}", myclientsocket.remoteendpoint.tostring(), encoding.ascii.getstring(result, 0, receivenumber));
}
catch(exception ex)
{
console.writeline(ex.message);
myclientsocket.shutdown(socketshutdown.both);
myclientsocket.close();
break;
}
}
}
}
}
以上是服务端(server)的完整代码。
客户端(client)的完整代码如下:
引入命名空间:
using system.net;
using system.net.sockets;
using system.threading;
完整代码:
namespace socketclient
{
class program
{
private static byte[] result = new byte[1024];
static void main(string[] args)
{
//设定服务器ip地址
ipaddress ip = ipaddress.parse("127.0.0.1");
socket clientsocket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);
try
{
clientsocket.connect(new ipendpoint(ip, 8885)); //配置服务器ip与端口
console.writeline("连接服务器成功");
}
catch
{
console.writeline("连接服务器失败,请按回车键退出!");
return;
}
//通过clientsocket接收数据
int receivelength = clientsocket.receive(result);
console.writeline("接收服务器消息:{0}",encoding.ascii.getstring(result,0,receivelength));
//通过 clientsocket 发送数据
for (int i = 0; i < 10; i++)
{
try
{
thread.sleep(1000); //等待1秒钟
string sendmessage = "client send message hellp" + datetime.now;
clientsocket.send(encoding.ascii.getbytes(sendmessage));
console.writeline("向服务器发送消息:{0}" + sendmessage);
}
catch
{
clientsocket.shutdown(socketshutdown.both);
clientsocket.close();
break;
}
}
console.writeline("发送完毕,按回车键退出");
console.readline();
}
}
}
编译成功后,先运行 服务端(server),再运行客户端(client)即可达到通信效果。
效果如下图:
该程序已在局域网测试通过。(192.168.x.x)
php socket通信(tcp/udp)
注意
1.在socket_bind的时候ip地址不能真回环地址如127.0.0.1
2.server.php后台跑起来的时候 nohup php server.php > /var/tmp/a.log 2>&1 &
一: udp 方式
1) server.php
<?php
//error_reporting( e_all );
set_time_limit( 0 );
ob_implicit_flush();
$socket = socket_create( af_inet, sock_dgram, sol_udp );
if ( $socket === false ) {
echo "socket_create() failed:reason:" . socket_strerror( socket_last_error() ) . "\n";
}
$ok = socket_bind( $socket, '202.85.218.133', 11109 );
if ( $ok === false ) {
echo "socket_bind() failed:reason:" . socket_strerror( socket_last_error( $socket ) );
}
while ( true ) {
$from = "";
$port = 0;
socket_recvfrom( $socket, $buf,1024, 0, $from, $port );
echo $buf;
usleep( 1000 );
}
?>
2) client.php
<?php
$sock = socket_create(af_inet, sock_dgram, sol_udp);
$msg = 'hello';
$len = strlen($msg);
socket_sendto($sock, $msg, $len, 0, '202.85.218.133', 11109);
socket_close($sock);
?>
一: tcp 方式
1)server.php
<?php
//error_reporting( e_all );
set_time_limit( 0 );
ob_implicit_flush();
$socket = socket_create( af_inet, sock_stream, sol_tcp );
socket_bind( $socket, '192.168.2.143', 11109 );
socket_listen($socket);
$acpt=socket_accept($socket);
echo "acpt!\n";
while ( $acpt ) {
$words=fgets(stdin);
socket_write($acpt,$words);
$hear=socket_read($acpt,1024);
echo $hear;
if("bye\r\n"==$hear){
socket_shutdown($acpt);
break;
}
usleep( 1000 );
}
socket_close($socket)
?>
2) client.php
<?php
$socket = socket_create(af_inet, sock_stream, sol_tcp);
$con=socket_connect($socket,'192.168.2.143',11109);
if(!$con){socket_close($socket);exit;}
echo "link\n";
while($con){
$hear=socket_read($socket,1024);
echo $hear;
$words=fgets(stdin);
socket_write($socket,$words);
if($words=="bye\r\n"){break;}
}
socket_shutdown($socket);
socket_close($sock);
?>
以上就是c#和php socket服务器与客户端通信实例代码(图)的详细内容。