java與C# Socket的區別、他們之間的通訊
阿新 • • 發佈:2019-02-10
先看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#客戶端