为了做到在局域网内使用手机控制电脑上的C#窗体软件,我使用了Socket,在C#端(服务器)和JAVA端(客户端)传递数据,为了方便以后使用,我把发送和接收都封装成了方法。
话不多少,直接上代码。
C#端(服务器):
IPAddress ip; //ip地址
IPEndPoint point;//带端口号的ip地址
Socket socketWatch;//用于监听的socket
Socket socketSend;//用于发送的socket
/// <summary>
/// 连接监听
/// </summary>
public void Listen()
{
//在服务器端创建一个负责监听IP地址和端口号的Socket
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
{
if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
{
ip = _IPAddress;//获取本机IP地址
//Console.WriteLine(ip.ToString());
}
}
//ip = IPAddress.Parse("192.168.1.110");//创建ip地址对象
point = new IPEndPoint(ip, 8998);//创建包含端口号的ip地址对象
socketWatch.Bind(point);//绑定包含端口的ip到监听socket
socketWatch.Listen(10);//开始监听,最大监听10个设备
while (true)
{
socketSend = socketWatch.Accept();//等待客户端的连接,并创建一个用于通讯的socket
Console.WriteLine(socketSend.RemoteEndPoint + "设备已连接到本服务器");
Thread listenThread = new Thread(new ParameterizedThreadStart(GetClientMessage));//创建负责监听的子线程
listenThread.IsBackground = true;//设置该子线程为后台线程
listenThread.Start(socketSend);//启动线程传入监听socket
}
}
/// <summary>
/// 获得客户端的消息
/// </summary>
/// <param name="obj">Socket对象(为子线程方法,参数只能为Object)</param>
private void GetClientMessage(Object obj)
{
Socket socket = obj as Socket;//转换数据类型
while (true)
{
Byte[] buffer = new Byte[2048];//接收信息的字节数组
int count = socket.Receive(buffer);//判断客户端连接状态
if (count == 0)
{
Console.WriteLine(socket.RemoteEndPoint + "断开连接");
break;//客户端断开时跳出
}
else
{
String str = Encoding.UTF8.GetString(buffer, 0, count);//获得客户端发送的信息
Console.WriteLine(socket.RemoteEndPoint + "发送消息:" + str);
}
}
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="returnData">要发送的数据</param>
/// <param name="returnSocket">发送数据使用的Socket</param>
private void ReturnData(Byte[] returnData,Socket returnSocket)
{
returnSocket.Send(returnData, returnData.Length, SocketFlags.None);//发送
}
JAVA端(客户端):
Socket socket;// socket对象
BufferedReader inputStream;//输入流
PrintWriter prints;//输出流
Boolean isDone = false;//连接状态
/**
* 连接
* @param ip ip地址
* @param post 端口
*/
public void GetConn(final String ip, final int post) {
new Thread(new Runnable() {// 创建连接线程(安卓4.4以上版本,网络操作不能写在主线程中,非安卓可不写线程)
public void run() {
try {
socket = new Socket(ip, post);// 创建连接到服务器的socket
} catch (Exception e) {
return;
}
}
}).start();
}
/**
* 接收消息
*/
public void GetMessage() {
try {
inputStream = new BufferedReader(new InputStreamReader(
socket.getInputStream()));//绑定输出流到socket上
new Thread(new Runnable() {
@Override
public void run() {
String str = null;//存放接收到的数据
while (isDone) {
try {
while ((str = inputStream.readLine()) != null) {
str = str.trim();
System.out.println("服务器:" + str);
}
} catch (IOException e) {
isDone = false;//断开连接
System.out.println("服务器无响应,与服务端断开连接...");
}
}
}
}).start();
} catch (IOException e) {
isDone = false;
System.out.println("无法连接到服务器...");
}
}
/**
* 发送消息
* @param message 要发送的信息
*/
public void SendMessage(String message) {
try {
prints = new PrintWriter(socket.getOutputStream());//绑定输出流到socket
new Thread(new Runnable() {
@Override
public void run() {
if (isDone) {
prints.print(message);//发送信息
prints.flush();//刷新缓存
Thread.sleep(1000);
}
}
}).start();
} catch (IOException e) {
isDone = false;
System.out.println("无法连接到服务器...");
}
}