java与C# Socket的区别、他们之间的通信

先看java代码

java服务器端:

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class 服务器 {

    public static void main(String[] args) {
        try {
            //在本机创建一个服务器 端口号为61666
            ServerSocket soo=new ServerSocket(61666);
            System.out.println("java创建服务器成功...");
            Socket so=soo.accept();//等待连接 连接成功才能往下执行
            InputStream in=so.getInputStream();//获取socket的输入流
            byte[]by=new byte[1024];
            while(true) {
                int len=in.read(by);
                System.out.println("java服务器收到消息 长度+" + len);
                System.out.println(new String(by,0,len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

java客户端:

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class 客户端 {

    public static void main(String[] args) {
        try {
            //第一个参数的服务器的ip 第二个参数是端口号
            Socket so=new Socket("127.0.0.1",61666);
            System.out.println("java连接服务器成功...");
            OutputStream out=so.getOutputStream();//获取socket的输出流
            Scanner in=new Scanner(System.in);
            while(true) {
                String s=in.nextLine();
                out.write(s.getBytes());
                out.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

这里写图片描述
这里写图片描述

再看C#的代码

C#这里写了两个方法 这里只讲第二个方法
C#服务器端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace 服务器
{
    class Program
    {
        static void 方法1() {
            Console.WriteLine("方法1");
            //第一个参数是指定socket对象使用的寻址方案,即IPV4或IPV6;
            //第二个参数socket对象的套接字的类型,此处stream是表示流式套接字
            //第三个参数socket对象支持的协议,TCP协议或UDP协议
            Socket soo = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//参数这样写就好了

            IPAddress ip = IPAddress.Parse("127.0.0.1");//本机ip作为服务器

            IPEndPoint ipend = new IPEndPoint(ip, 61666);//将网络终结点表示为 IP 地址和端口号

            soo.Bind(ipend);//用socket对像的Bind()方法绑定IPEndPoint 绑定主机端口号

            //上面这一段相当于java的ServerSocket soo=new ServerSocket(61666);
            //soo.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 61666));

            soo.Listen(10);//挂起的连接队列的最大长度。貌似可以不写。不是最大连接数


            Console.WriteLine("C#创建服务器成功...");


            Socket so = soo.Accept();//等待用户连接 和java一样
            byte[] by = new byte[1024];
            while (true)
            {
                int len = so.Receive(by);//Send发送 Receive接收
                Console.WriteLine("C#服务器收到消息 长度+" + len);
                Console.WriteLine(Encoding.Default.GetString(by, 0, len));
            }
        }
        static void 方法2()
        {
            Console.WriteLine("方法2");
            TcpListener listener = new TcpListener(61666);//已过时
            //TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 61666);

            listener.Start();//启动服务器
            //上面这一段相当于java的ServerSocket soo=new ServerSocket(61666);

            Console.WriteLine("C#创建服务器成功...");

            Socket so = listener.AcceptSocket();//等待用户连接 和java一毛一样
            NetworkStream io = new NetworkStream(so);
            byte[] by = new byte[1024];
            while (true)
            {
                //接收一组byte 存储到字节数组by里
                //从by[0]处开始存储该数据 要读取1024个字节
                //len为实际读取到的字节数
                int len = io.Read(by,0,10);

                Console.WriteLine("C#服务器收到消息 长度+" + len);
                Console.WriteLine(Encoding.Default.GetString(by, 0, len));
            }
        }
        static void Main(string[] args)
        {
            方法2();
        }
    }
}

C#客户端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace 客户端
{
    class Program
    {
        static void 方法1() {
            Console.WriteLine("方法1");
            Socket so = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            so.Connect("127.0.0.1", 61666);
            //相当于java的 Socket so=new Socket("127.0.0.1",61666);

            //so.Connect(IPAddress.Parse("127.0.0.1"), 61666);//也行
            Console.WriteLine("C#连接服务器成功...");
            while (true)
            {
                string s = Console.ReadLine();
                byte[] by = Encoding.Default.GetBytes(s);
                so.Send(by);//Send发送 Receive接收
            }
        }
        static void 方法2() {
            Console.WriteLine("方法2");
            TcpClient client = new TcpClient("127.0.0.1", 61666);//相当于java的 Socket so=new Socket("127.0.0.1",61666);
            NetworkStream io = client.GetStream();
            Console.WriteLine("C#连接服务器成功...");
            while (true)
            {
                string s = Console.ReadLine();
                byte[] by = Encoding.Default.GetBytes(s);//把字符串s转换成字节数组
                io.Write(by, 0, by.Length);
                io.Flush();
            }
        }
        static void Main(string[] args)
        {
            方法2();
        }
    }
}

这里写图片描述

他们之间也能通信

直接运行就行了 代码不变
C#服务器 java客户端
这里写图片描述
java服务器 C#客户端
这里写图片描述

阅读更多

没有更多推荐了,返回首页