socket 通信 C#服务器 android客户端
我想做一个android 和服务器(c#)通信的简单程序。
现在的问题是,android 客户端 能发送,服务器也能接受,但只能客户端发送一次,服务器才能发送一次,服务器不能连续发送,否则android 客户端 接受不到信息。
android 客户端
package net.androidla.socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class SocketActivity extends Activity {
private EditText ipStr;
private EditText portStr;
private EditText msgStr;
private TextView serverStr;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Button btnSend = (Button) findViewById(R.id.btnSend);
btnSend.setOnClickListener(onClickListener);
ipStr = (EditText) findViewById(R.id.ipStr);
portStr = (EditText) findViewById(R.id.portStr);
msgStr = (EditText) findViewById(R.id.msgStr);
serverStr = (TextView) findViewById(R.id.serverStr);
}
private OnClickListener onClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new TCPAndroidClient()).run();
}
};
class TCPAndroidClient implements Runnable {
String ip = ipStr.getText().toString().trim();
String port = portStr.getText().toString().trim();
String msg = msgStr.getText().toString().trim();
@Override
public void run() {
try {
Socket s = new Socket(ip, Integer.parseInt(port));
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
pw.println(msg+"\n");
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
// serverStr.setText(br.readLine());
serverStr.setText(serverStr.getText().toString()+br.readLine());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
c# 服务器端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace ChatServer
{
public partial class Form1 : Form
{
Socket s;
Socket cs;
Socket mcs;
byte[] msg;
public Form1()
{
InitializeComponent();
}
private void OnAccept(IAsyncResult ar)
{
cs = s.EndAccept(ar);
s.BeginAccept(new AsyncCallback(OnAccept), null);
msg = new byte[512];
cs.BeginReceive(msg, 0, msg.Length, SocketFlags.None, new AsyncCallback(OnReceive), cs);
}
private void OnReceive(IAsyncResult ar)
{
mcs = (Socket)ar.AsyncState;
mcs.EndReceive(ar);
// cs.BeginSend(msg, 0, msg.Length, SocketFlags.None, new AsyncCallback(OnSend), cs);
string strTemp="";
strTemp = Encoding.GetEncoding("utf-8").GetString(msg);
MessageBox.Show(strTemp);
msg = new byte[512];
mcs.BeginReceive(msg, 0, msg.Length, SocketFlags.None, new AsyncCallback(OnReceive), mcs);
//this.richTextBox1.Text += strTemp;
}
private void OnSend(IAsyncResult ar)
{
((Socket)ar.AsyncState).EndSend(ar);
}
private void Form1_Load_1(object sender, EventArgs e)
{
int port = 1000;
IPAddress ip = IPAddress.Parse("192.168.0.108");
IPEndPoint ipe = new IPEndPoint(ip, port);
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Bind(ipe);
s.Listen(5);
s.BeginAccept(new AsyncCallback(OnAccept), null);
}
private void button6_Click(object sender, EventArgs e)
{
byte[] aa=Encoding.GetEncoding("utf-8").GetBytes("abc"+"\n");
cs.BeginSend(aa, 0, aa.Length, SocketFlags.None, new AsyncCallback(OnSend), cs);
}
}
}
不能连续点击button6,否则android 客户端接受不到。必须android 客户端先点击一次发送,然后服务器触发 button6_Click
。服务器每次能收到数据。请高手请教是怎么回事