Android socket通讯客户端连不上服务器问题,以及发送消息程序就闪退

原本以为是线程问题但是好像又不是,实在找不到怎么弄了
这是客户端:
package com.chiaki.mysocketobject;

import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ChatActivity extends AppCompatActivity implements Runnable{

private static final String HOST = "172.16.2.54";
private static final int PORT = 12345;

private MsgAdapter adapter;
private ListView msgListView;
private List<Msg> msgList=new ArrayList<Msg>();

private  ImageButton send;
private  ImageButton connect;
private  EditText edit;
private TextView ctext;

private Socket socket;
private BufferedReader in = null;
private PrintWriter out = null;
private String content = "";
private StringBuilder sb = null;

public Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        if (msg.what == 0x123) {
            sb.append(content);
            ctext.setText(sb.toString());
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);

    adapter=new MsgAdapter(ChatActivity.this,R.layout.chat_list_view,msgList);

    ImageButton back = (ImageButton)findViewById(R.id.back);
    ImageButton voiceButton = (ImageButton)findViewById(R.id.voiceButton);
    connect = (ImageButton)findViewById(R.id.connectButton);
    send = (ImageButton)findViewById(R.id.send);
    edit = (EditText)findViewById(R.id.edit);
    ctext = (TextView)findViewById(R.id.chattext);
    msgListView=(ListView)findViewById(R.id.msg_list_view);
    sb = new StringBuilder();
    msgListView.setAdapter(adapter);

    // 点击按钮实例化Socket对象,与服务端进行连接,获取输入输出流
    // 连接服务器,要在子线程中
    connect.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new Thread() {
                @Override
                public void run() {
                    super.run();
                    try {
                        // 创建socket,连接服务器
                        socket = new Socket(HOST, PORT);//连接服务器
                        in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));//接收消息的流对象
                        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);//发送消息的流对象
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    });

    back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(ChatActivity.this,SocketActivity.class);
            startActivity(intent);
        }
    });

    send.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String con=edit.getText().toString();
            edit.setText("");
            if (socket.isConnected()) {
                if (!socket.isOutputShutdown()) {
                        out.println(con);//点击按钮发送消息
                }
            }
        }
    });
    //启动线程,连接服务器,并用死循环守候,接收服务器发送过来的数据
    new Thread(ChatActivity.this).start();
}

// 重写run方法,在该方法中输入流的读取
public void run() {
    try {
        while (true) {                 //死循环守护,监控服务器发来的消息
            if (socket.isConnected()) {           //如果服务器没有关闭
                if (!socket.isInputShutdown()) {          //连接正常
                    if ((content = in.readLine()) != null) {    //如果输入流没有断开
                        content += "\n";                    //读取接收的信息
                        handler.sendEmptyMessage(0x123);   //会发送一个空消息,但是指定了Message的what属性
                    }
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

这是layout文件主要的控件:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@android:drawable/checkbox_on_background"
android:id="@+id/connectButton"
android:layout_alignParentStart="true"
android:layout_below="@+id/edit" />

    <TextView                               //显示消息
        android:text="TextView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/chattext" />

    <ImageButton                                           //编辑消息
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@android:drawable/ic_btn_speak_now"
    android:id="@+id/voiceButton"
    android:layout_below="@+id/edit"
    android:layout_centerHorizontal="true" />

<ImageButton                                         //发送消息
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    app:srcCompat="@android:drawable/ic_menu_send"
    android:id="@+id/send"
    android:backgroundTint="?attr/colorButtonNormal"
    android:layout_alignParentBottom="true"
    android:layout_alignParentEnd="true" />

这是服务端:
import java.io.DataInputStream;
import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
// 定义相关的参数,端口,存储Socket连接的集合,ServerSocket对象

// 以及线程池

private static final int PORT = 12345;

private List mList = new ArrayList();

private ServerSocket server = null;

private ExecutorService myExecutorService = null;

public static void main(String[] args) {

new Server();

}

public Server() {  
    try {  
        server = new ServerSocket(PORT);  
        // 创建线程池  
        myExecutorService = Executors.newCachedThreadPool();  
        System.out.println("服务端运行中...\n");  
        Socket client = null;  
        while (true) {  
            client = server.accept();  
            mList.add(client);  
            myExecutorService.execute(new Service(client));  
        }  

    } catch (Exception e) {  
        e.printStackTrace();  
    }  
}  

class Service implements Runnable {  
    private Socket socket;  
    private BufferedReader in = null;  
    private String msg = "";  

    public Service(Socket socket) {  
        this.socket = socket;  
        try {  
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
            System.out.println("用户:" + this.socket.getInetAddress() + "~加入了聊天室" + "当前在线人数:" + mList.size()); 
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  

    @Override  
    public void run() {  
        try {  
            while (true) {  
                if ((msg = in.readLine()) != null) {  
                    if (msg.equals("bye")) {  
                        System.out.println("~~~~~~~~~~~~~");  
                        mList.remove(socket);  
                        in.close();  
                        System.out.println("用户:" + socket.getInetAddress() + "退出:" + "当前在线人数:" + mList.size());
                        socket.close();  
                        break;  
                    } else {
                        System.out.println(socket.getInetAddress() + "  说: " + msg);
                        this.sendmsg();
                    }  
                }  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  

    // 为连接上服务端的每个客户端发送信息  
    public void sendmsg() {   
        int num = mList.size();  
        for (int index = 0; index < num; index++) {  
            Socket mSocket = mList.get(index);  
            PrintWriter pout = null;  
            try {  
                pout = new PrintWriter(
                        new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "UTF-8")), true);  
                pout.println(msg);  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
} 

}

0

7个回答

你这个很可能是ArrayList的线程安全问题造成的,多线程同时操作,没有进行同步就很容易出现异常。

0

异常信息有吗?贴出来看一看

0

你的代码粘贴出来了,闪退的日志有没有,粘贴出来看看

0
chiakikuro
chiakikuro 日志贴在楼下了,不知道对不对
大约一年之前 回复

闪退日志是这个嘛?
图片说明

0
chiakikuro
chiakikuro 回复a568478312: 啊,解决了
大约一年之前 回复
a568478312
JabamiLight 兄弟,问题解决了吗?
大约一年之前 回复
a568478312
JabamiLight 你是用的真机还是模拟器,是否保证在一个局域网内?服务端是否正常运行。多打日志查看一下
大约一年之前 回复
chiakikuro
chiakikuro 回复a568478312: 但是找不到连不上服务器的原因
大约一年之前 回复
chiakikuro
chiakikuro 回复a568478312: 对,就是因为连不上服务器
大约一年之前 回复
a568478312
JabamiLight 提示你 if (socket.isConnected()) {}这行代码有个空指针,是不是没有连接就发送消息了。
大约一年之前 回复

虚拟化业务中,为虚拟机安装vmware tools是提升性能并实现各类调度功能的重要前提。
在最小化安装的centos6.8虚机上命令行安装vmware tools步骤如下:
1、vmware tools安装程序使用perl语言编写,所以最小化安装的centos虚拟机上,我们需要先把perl的相关程序组件进行安装以支持pl脚本。
使用yum源安装:
yum install perl

0

读取输入流的时候为null了吧,你做下判断。

0

感觉是你的socket没有创建或者没有创建成功,你在进行连接判断之前进行一下判断socket!=null。另外感觉你在按钮里面创建一个线程去创建socket没必要啊。还有就是socket在程序退出的时候记得要关闭,释放资源。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
总结Android Socket开发中可能遇到的问题
1. android网络请求需要放在工作线程中,socket通信也不例外; 2. 当socket长连接建立成功后,如果手机屏幕关闭,只要过很短的时间,android系统就会将socket服务挂起,这种行为应该是出于节电考虑的,但体验会下去很多,因为总是自动断开。另外当我们的手机通过数据线连接电脑调试的时候,手机熄灭屏幕后,socket服务是不会被自动挂起的,似乎在调试模式下,手机不会自动进入节电
socket网络编程中服务器与客户端通信失败的问题
服务器代码如下 public class server { public static void main(String[] args) throws IOException { ServerSocket server=new ServerSocket(5678); Socket socket=server.accept(); Inpu...
SOCKET客户端与服务端长时间通信后,会连接不上服务端的问题,以及server端UDP丢包的问题
人生第一篇博客,希望能以一个好的开始,chizhi
[Unity][unet][Android]电脑和电脑发送信息交互通讯
[Unity][unet][Android]真机安卓和模拟器安卓发送信息交互通讯 http://blog.csdn.net/bulademian/article/details/78403594 --------------------------------------------------- 演示画面 左边的 点击了按钮,显
关于Android使用socket与PC连接的问题
模拟器上能运行,真机上运行不了,这个问题一直困扰了我很久了。后来发现其实是很简单的一个道理~
C语言 Socket入门示例1—— 单工通信(客户端向服务器发送消息)
如果对Windows API不太熟悉、对TCP/IP通信协议不太熟悉,或者对C语言本身不太熟悉的话,学习Socket会有点难受的。以前学习操作系统的时候,被API吓怕了,很多莫名其妙的API有着多如牛毛的参数,令人费解。学习计算机网络的时候,又有那么多的协议,并且很多协议本身比较复杂,什么三次握手建立连接,什么四次握手释放链接等等,也没有学得特别透彻。更遗憾的是,以前学C的时候,误以为自己把C学会
安卓6.0以后,socket连接失败的原因
老早以前的项目要适配安卓7.0的平板电脑 - 信心满满的以为无缝适配,结果使用nio的socketchannel连接tcpserver时,一直连接失败,而同样的程序在5.0的安卓平板上就秒连,纳闷了,开始无头苍蝇似的乱撞,直接用socket也失败。 后来看到一个前辈的socket连接代码,connect之前调用了Thread.sleep方法睡了1000ms 抱着试一试的心态,在connec...
socket通信收不到服务器回复的解决方法
在发送给服务器的信息字符串末尾记得加上回车 换行符,如 &quot;\n&quot;
android-------- socket 实现客户端与服务器端通信
前面介绍了Socket的简介和原理,今天简单的来实现一下客服端与服务器通信的功能 客服端建立连接 try { socket = new Socket(&quot;192.168.1.100&quot;, 9999); Log.i(&quot;Android&quot;, &quot;与服务器建立连接:&quot; + socket); } catch (UnknownHostException e) { ...
服务器java客户端C#的Socket通讯遇到的坑
java用的netty,C#用的HPSocket,遇到的坑之   1、C#  ushort  head=0xff; //自定义的包头         java  short  head=0xff;//自定义的包头 出现了一个坑:C#将head转为byte[]发给java的时候,byte[]转为short,发现得到的数是0xff*64,于是java将short转为byte[]发给客户端,需要将
socket遇到错误直接退出原因和解决办法
原因:socket遇到错误时,默认将错误信息交给系统处理,而系统的处理办法一般是直接关闭整个应用,所以就会出现遇到错误程序直接关闭,比如客户端关闭,服务器还在给客户端发信息,就会出现发送失败,导致服务器也直接关闭的现象解决办法:把错误交给自己定义的函数处理 先定义一个函数void Perr(int signum) { if(signum==SIGPIPE) { fpri
Android 使用mina框架 搭建socket客户端,进行与服务器端通信
注意: 在设置编码过滤的时候 一定要注意 服务器端和客户端的编码要一致mina框架解释 简单理解就是 :封装了底层的读写流操作,提供高级操作API的通讯框架 当前发行的 MINA 版本支持基于Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。 Mina位于用户程序和网络处理之间,将用户从复杂的网络处理中解
android用socket向服务器发送和接收消息 【转自网易闯京城的博客】
本文是一个demo,模拟一个android客户端可以持续的向socket服务器发送和从socket服务器接收消息。 先上效果图: 手机上的图:    我们可以看到  手机上的消息可以发送到服务器上,服务器上的消息手机上也可以接收并显示出来。关于这个服务器端的下载地址还是要看前面的博客。java Socket从服务器连续取消息 下面上代码:先是布局文件xml<?
C#使用Socket简单异步通讯
C#使用SocketAsyncEventArgs操作套接字的简单异步通讯
android socket通信demo (本篇服务于android消息推送)
本文系作者原创,转载请附原文地址,谢谢。 原文地址: 文章末尾提供本文中的源码下载链接,需资源积分1分,人艰不拆,下载后评论资源可获系统返回积分=无损! 前言: 关于什么是socket通信,本篇文档中不进行解释,不甚清楚的可以去百科查找,日后得空我也会整理相关的内容。 本文是对上一篇关于消息推送的文章的补充,此处给出快速链接:http://blog.csdn.ne
Android——socket连接(客户端发消息给服务端)
准备工作 一台手机作服务端,一台手机作客户端,两部手机连接同一个wifi 服务端 布局 MainActivity 客户端 布局 MainActivity
【socket】用PHP的socket实现客户端到服务端的通信
一、client.php客户端:
使用Socket实现Android客户端与Web服务器多对一的双向通信
使用Socket实现Web服务端与Android客户端的双向通信,支持中文,支持客户端与服务端多对一
C# Socket编程之服务器端发送消息与接收消息(一)
Serv.cs   while (true)             {     //向客户端发送一条消息                                 Socket clintSocket = serverSocket.Accept();//接收一个客户端连接,如果没有客户端连接则会一直暂停在此处。                 string msg = &quot;Hel...
WebSocket发送消息后自动断开的问题
websocket与C++后端握手成功,server端能正常解析出client发来的数据,但是组包之后发回给client,client立刻断开websocket。 我之前使用flashAIR写的server端并没有遇到这个问题,而改用C++后就会出现。 Chrome控制台报错: websocket A server must not mask any frames that it sends
android端基于socket的局域网内服务器与客户端加密通信
android端基于socket的局域网内服务器与客户端加密通信实现了基本的socket通信(即两台设备,一台用作服务器,一台用作客户端),服务器进行监听,客户端发送加密数据到服务器,服务器进行解密得到明文。 注意:本项目中使用了ButterKnife及EventBus作为辅助工具,通信建立时默认网络正常(未做局域网网络环境检测),加密方式为AES加密
Socket跨平台通信——服务端Android、客户端iOS
本文讲述了: 1、如何在Android上搭建Mina服务端(使用Mina 2.0.15、编程环境Eclipse); 2、如何在iOS上建立Socket客户端(使用CocoaAsyncSocket第三方通讯框架、Swift3.0); 3、Android iOS间的TCPSocket通讯测试。 一、在Android上搭建Mina服务端1、下载Mina最新版 直接进官网:http:
使用socket实现简单的客户端和服务端通信(C#语言)
1.主要思路: (1) 服务端开启监听线程,等待客户端的连接。 每个socket连接放到独立线程中处理。 (2) 服务端和客户端使用约定的消息格式通信。对于比较复杂的消息(如向服务端传递一个实例),可以使用json封装传输。 (3) 每个连接的客户端,注册唯一的ClientID,在服务端以此来区分消息的来源。 2.代码构成 实现该样例包含两个cs的客户端程序。 分别为 服务
关于c# socket 同步通信的简单程序
C#socket通信关于C#socket通信,分为同步和异步通信,本文简单介绍一下同步通信。通信两端分别为客户端(Client)和服务器(Server):(1)Cient:1:建立一个Socket对像;2:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;3:如果连接成功,就用socket对像的Send()方法向服务器发送信息;4:用sock...
系统运行一段时间后,客户端不能连接上服务器(有SOCKET开发经验的欢迎一起讨论)...
情况是这样的,我们的一台服务器连接比较多。他由两个部分组成,WEB部分和应用服务。这台服务器存在以下几种连接 1)和另外一个服务器的长连接 2)和几百台设备的短连接(服务器需要频繁访问这些设备) 3)从这台服务器的WEB到应用的短连接(需要应用转发到设备成功后再原路返回) 4)和客户端的长连接(把设备信息发送给客户端查看) 服务器刚启动时间后运行很正常,大概过了一个星期后,开始...
Android 通过WebSocket实现IM功能那些坑
前不久在项目中实现了Im功能,之前im功能使用使用第三方,这次用到了WebSocket。找到https://github.com/TooTallNate/Java-WebSocketcompile &quot;org.java-websocket:Java-WebSocket:1.3.7&quot;基于库实现过程遇到不少问题:坑1:WebSocketClient objects are not reuseable  ...
Android客户端和Java服务器端Socket代码连的坑(接空指针异常问题)
这个问题困扰了博主一整天,博主用Idea写了一个服务器端,然后用Android Studio写了一个客户端,用的是Socket方式。然而他们却一直连接不成功。   看一下报错空指针异常。服务器端是没有传东西过来的,连接到了服务器端就会提示,还没连接上。   博主看了一下服务器端代码,嗯,没错,服务器端已经启动了。   然后博主想看看客户端的代码死在了哪里,那就用debug模式(后面附上Ide
Socket编程 客户端给服务端发送消息,服务端回复
1、创建服务端 package server_scoket; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import j...
C++ socket编程 实现服务端与客户端的通讯
服务器端程序: // Server.cpp : Defines the entry point for the console application. // #include "winsock2.h" #pragma comment(lib, "ws2_32.lib") #include using namespace std; int main(int argc, char*
socket客户端连续消息发送
一 服务端程序 # 导入模块 import socket import random # 创建实例 sk = socket.socket() # 定义需要绑定的ip和端口 ip_port = (&quot;127.0.0.1&quot;, 8888) # 绑定监听 sk.bind(ip_port) # 最大连接数 sk.listen(5) # 不断循环,不断接收数据 while True: # 提...
android真机运行闪退问题
两个步骤: 第一:确定自己setting-&amp;gt;build-&amp;gt;instant里面不要勾选instant 第二:如果你已经确认自己的设置没错,特别是以前用真机运行成功的,问题一定在你的代码上,看看你你关于各个组件的声明是否有误,问题一定在代码,可以设置断点测试自己的代码,检查问题出在哪里 希望能帮到你,共同学习。 ...
Android移动开发-使用Socket进行通信的实现
TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信了。Java对基于TCP协议的网络通信提供了良好的封装,Java使用Socket对象来代表两端通信接口,并通过Socket产生IO流来进行网络通信。 客户端通常可以使用Socket的构造器来连接到指定服务器,其实客户端程序也非常简单,它仅仅使用Socket建立与指导IP地址、指定端口的连接,并使用Socket获取输入流读取数据。该客户端程序是一个Android应用,因此还是需要先建立Android项目,该程序的界面中包括一个文本框,用于显示从服务器端读取的字符串数据。
Qt中利用TCP实现多个客户端之间相互发送消息系以及服务器的群发信息
前两天写了个简单的服务器和客户端之间的数据传送,主要是为了熟悉一下QTcpsocket和QTcpserver的用法,然后今天在此基础上实现多个客户端之间的相互通信以及利用服务器可以群发信息。(只是供大家参考,勿喷) 代码运行如图 思路如下:首先每个客户端与服务器相连是会有一个对应的Tcpsocket,把这些sockt全部放入一个list容器中,当客户端有数据发送时,读取是哪个socke
unity3d 简易socket通信,接收发送消息
using UnityEngine; using System.Collections; using System; using System.Text; using System.Net.Sockets; using System.Threading; using System.Collections.Generic; using System.ComponentModel; using Uni...
C# Socket编程之客户端发送消息与接收消息(二)
客户端代码: Client.cs //获取到Socket协议             Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);             //绑定IP与端口             IPAddress ipAddress = IPA...
ServerSocket和Socket建立通信(客户端发送消息服务器接收并返回到客户端接收输出)
需求:客户端发送消息到服务器,服务器接收到消息并读取输出,然后写出到客户端客户端接收到输出。 1、建立服务器端      |-服务器建立通信ServerSocket      |-服务器建立Socket接收客户端连接      |-建立IO输入流读取客户端发送的数据      |-建立IO输出流向客户端发送数据消息 2、建立客户端      |-创建Socket通信,设置通信服务器的
socket通讯测试工具
用于soket通讯开发,可以方便测试通讯工具,填写通讯端口即可。
php socket客户端和服务端互相通讯实例
示例代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27     set_time_limit(0);     $host="localhost";     $port=1001;      
Socket实现简单的指定客户端发送信息(C#)
Socket实现简单的指定客户端发送信息(效果如下图)   不多说了,直接上代码: server端: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Net.Sockets...
springboot之基于Socket的两个或多个客户端之间的聊天功能
一、 Socket简介点击超链接查看: socket与HTTP的区别二、两个或多个客户端之间进行聊天1、 服务器端(1) 实体类:原理:每个用户都有自己的socket套接字,也就是每个用户都有自己的输出流和输入流,只要用某个用户的输出流 进行输出,某个用户就可以接收到消息。public class SocketUser { private String name; private ...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 物联网通讯费用 大数据学习路线以及资料