套接字已关闭-c#服务器android客户端
我有以下代码。我的c#服务器和安卓客户端可以在单击“连接”按钮时无缝连接,但连接后我无法将安卓客户端的数据发送到c#服务器,安卓客户端说:“套接字已关闭” 当我点击“连接”按钮时,android是“连接”的,服务器是“接受”的,但我点击“发送”时,客户端说套接字关闭了 c#服务器 } 安卓客户端套接字已关闭-c#服务器android客户端,c#,android,sockets,client,C#,Android,Sockets,Client,我有以下代码。我的c#服务器和安卓客户端可以在单击“连接”按钮时无缝连接,但连接后我无法将安卓客户端的数据发送到c#服务器,安卓客户端说:“套接字已关闭” 当我点击“连接”按钮时,android是“连接”的,服务器是“接受”的,但我点击“发送”时,客户端说套接字关闭了 c#服务器 } 安卓客户端 /***************************巴兰*********************/ /***********************连接*********************/
/***************************巴兰*********************/
/***********************连接*********************/
公共类Baglan扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
progressDialog=新建progressDialog(上下文);
progressDialog.setMessage(“Sunucuya Bağlanılıyor.”);
progressDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…args){
inetAddressServerAddr=null;
试一试{
serverAddr=InetAddress.getByName(Evrensel.SERVER\u IP);
套接字=新套接字(serverAddr、Evrensel.SERVER\u端口);
Log.d(“FEF”,“Evrensel Socket bağlandı..”+Socket.isConnected());
}捕获(IOE异常){
e、 printStackTrace();
}最后{
if(套接字!=null){
试一试{
socket.close();
socket=null;
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
返回null;
}
@凌驾
受保护的void onPostExecute(void v){
super.onPostExecute(v);
progressDialog.disclose();
}
}
/***********************发送消息*********************/
/***********************梅萨杰·贡德*********************/
公共类MesajGonder扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
progressDialog=新建progressDialog(上下文);
progressDialog.setMessage(“Sunucuya Mesaj Gönderiyor..”);
progressDialog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…args){
字符串serverResponse=“”;
PrintWriter mBufferOut=null;
试一试{
mBufferOut=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()),true);
mBufferOut.println(参数[0]);
}捕获(IOE异常){
e、 printStackTrace();
}
返回服务器响应;
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
progressDialog.disclose();
}
}
我解决了这个问题。。
问题是异步任务。。不要使用asynctask。。背景。。使用线程。。可运行线程
新的Android客户端代码是。。
也许找出哪一方有问题的最好方法是运行wireshark跟踪。寻找FIN或RST,告诉我们哪一方先发送。从那里你至少可以知道哪一方正在结束会话。你知道哪一方将结束这次会议吗?记住,在进行任何沟通之前,双方必须相互通知。这真的有效吗?这并不是你最初问题的解决方案,只是你一连接就关闭了插座!这段新代码有效的原因不是因为您切换了线程模型,而是因为您更改了任务的功能。这个版本的代码保持套接字打开,因此当然比不打开的代码工作得更好。
public class SoketPaketi
{
public Socket soket;
public int istemciNo;
public byte[] tampon = new byte[1024];
public SoketPaketi(Socket soc, int no)
{
this.soket = soc;
this.istemciNo = no;
}
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
dinlemeyeBasla();
}
private void dinlemeyeBasla()
{
sunucuSoketi = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint IP_PORT = new IPEndPoint(IP_ADRES,PORT);
sunucuSoketi.Bind(IP_PORT);
sunucuSoketi.Listen(10);
Console.WriteLine("Server Dinlemeye Başladı.. " + IP_PORT.ToString());
sunucuSoketi.BeginAccept(new AsyncCallback(onBaglanmaIstegiGeldiginde), null);
}
private void onBaglanmaIstegiGeldiginde(IAsyncResult ar)
{
Socket calismaSoketi = sunucuSoketi.EndAccept(ar);
istemciler.Add(calismaSoketi);
veriBekle(calismaSoketi,istemciler.Count - 1);
sunucuSoketi.BeginAccept(new AsyncCallback(onBaglanmaIstegiGeldiginde), null);
Console.WriteLine("İstemci Bağlantısı Kabul Edildi..");
}
private void veriBekle(Socket socket, int istemciNo)
{
try
{
if (geriBildirim == null)
{
geriBildirim = new AsyncCallback(onVeriGeldiginde);
}
SoketPaketi soketPaketi = new SoketPaketi(socket, istemciNo);
socket.BeginReceive(soketPaketi.tampon, 0, soketPaketi.tampon.Length,SocketFlags.None, onVeriGeldiginde, soketPaketi);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
private void onVeriGeldiginde(IAsyncResult ar)
{
//Console.WriteLine("onVeriGeldiginde");
SoketPaketi soketPaketi = (SoketPaketi)ar.AsyncState;
int gelenBoyut = soketPaketi.soket.EndReceive(ar);
if (gelenBoyut > 0)
{
char[] karakterler = new char[gelenBoyut + 1];
Decoder d = Encoding.UTF8.GetDecoder();
int karakterUzunlugu = d.GetChars(soketPaketi.tampon, 0, gelenBoyut, karakterler, 0);
String gelenVeri = new String(karakterler);
Console.WriteLine("İstemciden Veri Geldi.. Gelen Veri : " + gelenVeri);
Console.WriteLine("Data Recieved from client.. Received Data : " + gelenVeri);
}
veriBekle(soketPaketi.soket, soketPaketi.istemciNo);
}
}
/*********************** Bağlan *********************/
/*********************** Connect *********************/
public class Baglan extends AsyncTask<Void,Void,Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(context);
progressDialog.setMessage("Sunucuya Bağlanılıyor..!");
progressDialog.show();
}
@Override
protected Void doInBackground(Void... args) {
InetAddress serverAddr = null;
try {
serverAddr = InetAddress.getByName(Evrensel.SERVER_IP);
socket = new Socket(serverAddr, Evrensel.SERVER_PORT);
Log.d("FEF","Evrensel Socket bağlandı.." + socket.isConnected());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
socket = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onPostExecute(Void v) {
super.onPostExecute(v);
progressDialog.dismiss();
}
}
/*********************** Send Message *********************/
/*********************** Mesaj Gönder *********************/
public class MesajGonder extends AsyncTask <String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(context);
progressDialog.setMessage("Sunucuya Mesaj Gönderiliyor..!");
progressDialog.show();
}
@Override
protected String doInBackground(String... args) {
String serverResponse = "";
PrintWriter mBufferOut = null;
try {
mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
mBufferOut.println(args[0]);
} catch (IOException e) {
e.printStackTrace();
}
return serverResponse;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
progressDialog.dismiss();
}
}
public class MainActivity extends ActionBarActivity {
public static Socket socket;
public static final String SERVER_IP = "192.168.1.81";
public static final int SERVER_PORT = 6000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnBaglan = (Button)findViewById(R.id.btnBaglan);
btnBaglan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Baglan()).start();
}
});
Button btnGonder = (Button)findViewById(R.id.btnGonder);
btnGonder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new MesajGonder()).start();
}
});
}
public class Baglan implements Runnable {
@Override
public void run() {
InetAddress serverAddr = null;
try {
serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVER_PORT);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Log.d("FEF", "Socket bağlandımı:" + socket.isConnected());
}
}
public class MesajGonder implements Runnable{
@Override
public void run() {
PrintWriter mBufferOut = null;
try {
mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
mBufferOut.println("Breko breko");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}