socket 通信 C#服务器 android客户端

yyjpz2007 2011-09-17 02:33:32
我想做一个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
。服务器每次能收到数据。请高手请教是怎么回事
...全文
813 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenshi009 2012-10-07
  • 打赏
  • 举报
回复
你的逻辑就是发送后才接收,客户端点击后发送,然后阻塞起来等待服务器端响应,响应完成后方法完成,socket作为局部变量,已经释放,肯定不能接收了吧,如果要实现通信,个人愚见,开两个线程,一个用来发送消息,一个用来接收消息。
nkhuangyanping 2012-05-31
  • 打赏
  • 举报
回复
实现了么?支持一下,我现在遇到的问题是android客户端能发送数据到服务器,服务器能收到,但是服务器发送的客户端接收不到。

110,546

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧