工作環(huán)境需求:服務端使用C#編寫叉钥,客戶端使用Java編寫罢缸。以下是一個C#客戶端與Java服務端通過socket通信的一個Demo。
- Java服務端代碼
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private ServerSocket serverSocket;
public Server() {
try {
//設置你服務器監(jiān)聽的端口為10000投队,用戶能使用的端口為1025-65535
serverSocket = new ServerSocket(2000);
} catch (IOException e) {
e.printStackTrace();
}
//創(chuàng)建新的監(jiān)聽主線程枫疆,這個線程創(chuàng)建ServerSocket監(jiān)聽
new Thread(new Runnable() {
public void run() {
while (true) {
Socket socket = null;
try {
socket = serverSocket.accept();
//當監(jiān)聽到了客戶端連接后,創(chuàng)建新線程傳輸數(shù)據(jù)敷鸦,這樣可以實現(xiàn)多個客戶端同時訪問
new Thread(new SocketHandler(socket)).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
class SocketHandler implements Runnable {
private Socket socket;
private BufferedReader reader;
private PrintWriter writer;
SocketHandler(Socket socket) {
try {
this.socket = socket;
reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream(), "GB2312"));
writer = new PrintWriter(socket.getOutputStream(), true);
int i = 0;
while (true) {
i++;
writer.println("-------welcome---------" + i );
Thread.sleep(3000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//這里是覆蓋實現(xiàn)接口Runnable里的run()
public void run() {
try {
//讀取數(shù)據(jù)息楔,這里只能讀取一行String
String line = reader.readLine();
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
} finally {
//最后要關(guān)閉Socket
try {
if (socket != null) socket.close();
if (reader != null) reader.close();
if (writer != null) writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new Server();
}
}
- C#客戶端代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace Client
{
class Program
{
static void Main(string[] args)
{
try
{
int port = 2000;
string host = "127.0.0.1";
///創(chuàng)建終結(jié)點EndPoint
IPAddress ip = IPAddress.Parse(host);
//IPAddress ipp = new IPAddress("127.0.0.1");
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口轉(zhuǎn)化為IPEndpoint實例
///創(chuàng)建socket并連接到服務器
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//創(chuàng)建Socket
Console.WriteLine("Conneting…");
c.Connect(ipe);//連接到服務器
///向服務器發(fā)送信息
string sendStr = "hello!This is a socket test";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);//把字符串編碼為字節(jié)
Console.WriteLine("Send Message");
c.Send(bs, bs.Length, 0);//發(fā)送信息
while(true) {
///接受從服務器返回的信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//從服務器端接受返回信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
Console.WriteLine("client get message:{0}", recvStr);//顯示服務器返回信息
}
/////接受從服務器返回的信息
//string recvStr = "";
//byte[] recvBytes = new byte[1024];
//int bytes;
//bytes = c.Receive(recvBytes, recvBytes.Length, 0);//從服務器端接受返回信息
//recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
//Console.WriteLine("client get message:{0}", recvStr);//顯示服務器返回信息
///一定記著用完socket后要關(guān)閉
c.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("argumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException:{0}", e);
}
Console.WriteLine("Press Enter to Exit");
Console.ReadLine();
}
}
}