c# - 如何通过 C# windows 应用程序发送数据并使用 TCP/IP 协议从 android 客户端接收数据
问题描述
我有 Win forms 应用程序,可以将数据传输到 android 应用程序并从中接收。我没有问题让 C#application 监听 android 并获取数据,但是当我尝试将数据发送到 android android 应用程序时什么也不显示。
RecordsBoard.java:
public class RecordsBoard {
// DatabaseHelper mydb;
private final Activity owner;
private final ListView lv;
private final ArrayList<HashMap<String, String>> dataMerged = new ArrayList<HashMap<String, String>>();
private final SimpleAdapter adapterMergedData;
private final TextView tvCount;
private final TextView rfid;
private final TextView te;
public RecordsBoard(Activity context, View ll) {
owner = context;
adapterMergedData = new SimpleAdapter(owner, dataMerged, R.layout.common_lv2overlap_tv2, new String[]{"0", "1"}, new int[]{R.id.idE2CommenLv2OverlapTv1_tv0, R.id.idE2CommenLv2OverlapTv1_tv1});
lv = (ListView) ll.findViewById(R.id.idE2CommenLv2Overlap_lvShow);
lv.setAdapter(adapterMergedData);
rfid = (TextView) ll.findViewById(R.id.test);
tvCount = (TextView) ll.findViewById(R.id.idE2CommenLv2Overlap_tvTagsCount);
te = (TextView) ll.findViewById(R.id.test1);
}
public void addMassage(final String string) {
owner.runOnUiThread(new Runnable() {
@Override
public void run() {
// update the merged data list
// DatabaseHelper mydb = new DatabaseHelper(this);
int index = 0;
for (; index < dataMerged.size(); index++) {
HashMap<String, String> omap = dataMerged.get(index);
if (omap.get("0").equals(string)) {// found it
int num = 1;
String numString = omap.get("1");
if (numString != null) {
try {
num = Integer.valueOf(numString);
} catch (Exception e) {
e.printStackTrace();
}
}
num++;
omap.put("1", "" + num);
break;
}
}
if (index == dataMerged.size()) {// not found in merged data list
HashMap<String, String> map = new HashMap<String, String>();
map.put("0", string);
//map.put("1", "" + 1);
dataMerged.add(map);
//if(!"{".equals(map)){
String s= map.toString();
// s= s.replaceAll("}","");
//rfid.setText(s);
rfid.setText(rfid.getText().toString()+ s);
messagesender message = new messagesender();//send to C# class
message.execute(s);
Thread myThred = new Thread(new Myserver());
myThred.start();
// }
// if(!"}".equals(map))
}
tvCount.setText("" + dataMerged.size());
/* String s= rfid.getText().toString();
s= s.replaceAll("}","");
rfid.setText(s);*/
adapterMergedData.notifyDataSetChanged();
}
});
}
class Myserver implements Runnable{//Here I reviece the data
Socket s;
ServerSocket ss;
InputStreamReader isr;
BufferedReader bufferedReader;
Handler h1 = new Handler() ;
String msg;
@Override
public void run() {
try{
ss=new ServerSocket(9999);
while (true){
s=ss.accept();
isr = new InputStreamReader(s.getInputStream());
bufferedReader = new BufferedReader(isr);
msg=bufferedReader.readLine();
h1.post(new Runnable() {
@Override
public void run() {
//Toast.makeText(this.getApplicationContext(),msg,Toast.LENGTH_SHORT).show();
te.setText(msg);
}
});
}
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
public void resetMassages(final ArrayList<HashMap<String, String>> msgs) {
owner.runOnUiThread(new Runnable() {
@Override
public void run() {
dataMerged.clear();
dataMerged.addAll(msgs);
tvCount.setText("" + dataMerged.size());
adapterMergedData.notifyDataSetChanged();
}
});
}
public void clearMsg() {// clear data
owner.runOnUiThread(new Runnable() {
@Override
public void run() {
dataMerged.clear();
tvCount.setText("" + dataMerged.size());
adapterMergedData.notifyDataSetChanged();
}
});
}
public ArrayList<HashMap<String, String>> getData() {
ArrayList<HashMap<String, String>> ret = new ArrayList<HashMap<String, String>>();
ret.addAll(dataMerged);
return ret;
}
public boolean isEmpty() {
return dataMerged.isEmpty();
}
消息发送器.java:
public class messagesender extends AsyncTask<String, Void, Void> {
Socket s;
DataOutputStream dos;
PrintWriter print;
@Override
protected Void doInBackground(String... voids) {
String message = voids[0];
try {
s = new Socket("192.168.1.125",9999);
print = new PrintWriter(s.getOutputStream());
print.write(message);
print.flush();
print.close();
s.close();
}catch (IOException e){
e.printStackTrace();
}
return null;
}
}
C# 发送/接收线程:
new Thread(() =>
{
Thread.CurrentThread.IsBackground = true;
TcpListener server = null;
try
{
// Set the TcpListener on port 13000.
Int32 port = 9999;
IPAddress localAddr = IPAddress.Parse("192.168.1.125");
// TcpListener server = new TcpListener(port);
server = new TcpListener(localAddr, port);
// Start listening for client requests.
server.Start();
// Buffer for reading data
Byte[] bytes = new Byte[256];
String data = null;
// Enter the listening loop.
// Enter the listening loop.
while (true)
{
Console.Write("Waiting for a connection... ");
// Perform a blocking call to accept requests.
// You could also user server.AcceptSocket() here.
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Connected!");
data = null;
//while (true)
//{
// Get a stream object for reading and writing
NetworkStream stream = client.GetStream();
int i;
int l = 0;
// Loop to receive all the data sent by the client.
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
// Translate data bytes to a ASCII string.
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
// Console.WriteLine(data);
var charsToRemove = new string[] { "{", "}", "Uii", "0=", ":", " " };
foreach (var ca in charsToRemove)
{
data = data.Replace(ca, string.Empty);
}
info = data.Substring(4, 16);
//insert data into base
if (test == info)
{//MessageBox.Show("Sub: " + info+ "nb:"+l, "sub");
DateTime now = DateTime.Now;
string sqlcode = @"INSERT INTO [dbo].[handcounter]
([RFID])
VALUES
('" + data + "')";
string source = "Data Source=DESKTOP-E2LOQH3;Initial Catalog=Store;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
SqlConnection con = new SqlConnection(source);
con.Open();
SqlCommand c = new SqlCommand(sqlcode, con);
c.ExecuteNonQuery();
con.Close();
}
data = "ala sender";
data = data.ToUpper();
byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
// Send back a response.
stream.Write(msg, 0, msg.Length);
Console.WriteLine("Sent: {0}", data);
}
// Shutdown and end connection
client.Close();
}
}
catch (SocketException m)
{
MessageBox.Show("SocketException: {0}");
}
finally
{
// Stop listening for new clients.
server.Stop();
}
Console.WriteLine("\nHit enter to continue...");
Console.Read();
// timer1.Stop();
Console.WriteLine("Hello, world");
}).Start();
感谢您的帮助...
解决方案
isr = new InputStreamReader(s.getInputStream());
bufferedReader = new BufferedReader(isr);
把它从while循环中取出。
您应该只调用一次这些语句。
把它们放在一会儿之前。
推荐阅读
- java - 在使用 Spring 数据 JPA 获取/删除之前,我是否应该检查实体是否存在?
- firebase - Flutter Firebase Firestore:升级选项工作不正确
- rust - rust - 变量的寿命不够长
- python - 如何将文件下载到项目目录内的文件夹中?(硒)
- java - 方法不允许,状态 = 405,使用 Thymeleaf 的 HTML 表单
- android-jetpack-compose - Jetpack Compose 中的单个事件如何工作?
- eclipse - 无法使用 Eclipse RSE 将文件从本地计算机复制到远程目标
- dos - 垂直总寄存器与垂直显示结束 CRT 控制器寄存器
- python - 间接定义函数调用的变量
- html - 将单独的 txt 文件插入
没有js的标签只有html