1. 程式人生 > >java與C# Socket的區別、他們之間的通訊

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#客戶端
這裡寫圖片描述