socket都可以用“打开open –> 读写write/read –> 关闭close”模式来操作
它不属于某一种语言,任何语言都可以使用,只是语言的封装及使用方法略有不同,但是socket的内部结构不会变。
这里实现一下两种语言间的通讯,对比两种语言的差异及相同
用go语言实现服务器端程序,c#实现客户端程序
go语言 server:
// server project main.go
package main
import (
"fmt"
"net"
)
//var ConnMap map[string]*net.TCPConn
func main() {
listen_socket, err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("sever start error")
}
defer listen_socket.Close()
fmt.Println("server is wating ....")
for {
conn, err := listen_socket.Accept()
if err != nil {
fmt.Println("conn fail ...")
}
fmt.Println("connect client successed")
var msg string
for {
msg = ""
data := make([]byte, 255)
msg_read, err := conn.Read(data)
if msg_read == 0 || err != nil {
break
}
msg_read_str := string(data[0:msg_read])
if msg_read_str == "close" {
conn.Write([]byte("close"))
break
}
//fmt.Println(string(data[0:msg_read]))
fmt.Println("client say: ", msg_read_str)
fmt.Printf("say to client: ")
fmt.Scan(&msg)
//conn.Write([]byte("hello client\n"))
//msg_write := []byte(msg)
conn.Write([]byte(msg))
}
fmt.Println("client Close\n")
conn.Close()
}
}
c# client:
using System;
using System.Net;
using System.Net.Sockets;
using System.Collections;
public class netClient
{
public static void Main(string[] args)
{
Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string host = "127.0.0.1";
int port = 8000;
_socket.Connect(host, port);
Console.WriteLine("连接成功");
while (true)
{
string buffStr;
Console.WriteLine("对服务器说:");
buffStr = Console.ReadLine();
Console.WriteLine("对服务器说:" + buffStr);
byte[] readBuff = System.Text.Encoding.UTF8.GetBytes(buffStr);
try
{
_socket.Send(readBuff);
}
catch { }
int buffCount = _socket.Receive(readBuff);
buffStr = System.Text.Encoding.UTF8.GetString(readBuff, 0, buffCount);
Console.WriteLine("服务器说:" + buffStr);
}
}
}
程序截图:
socket的基本操作
server:
1.创建监听套接字
2.绑定ip+port
3.等待连接
4.接收/发送
5.关闭
client:
1.创建套接字
2.连接服务器地址
3.接收/发送
4.关闭
网络编程socket的步骤差不多就这些,来看一下上面的程序对这些的运用:
server:
listen_socket, err := net.Listen("tcp", "127.0.0.1:8000") //1,2步骤
conn, err := listen_socket.Accept() // 3步骤
msg_read, err := conn.Read(data) / conn.Write([]byte(msg)) // 4 步骤
client:
Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //1 步骤
_socket.Connect(host, port); // 2 步骤
_socket.Send(readBuff); / int buffCount = _socket.Receive(readBuff); //3 步骤
可以看出核心步骤都是一样的,只是因为不同的语言会根据自己的特性,风格 再进行封装一次。
在使用方法上有所不同 (read/write )/(send / receive) 都是实现的同一个东西。
所以只要用的同一套接口,不同语言间通信就没有什么障碍。