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();  
            }  
        }  
    }  
} 

}

7个回答

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

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

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

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

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

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

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
oralce客户端连不上服务器问题
我的电脑装了oralce客户端,可以ping通服务器ip(192.168.1.100),但是用pl/sql developer登录不了服务器,错误是:ORA-12535 TNS 操作超时。我连了几次都这样。我的tnsnames.ora配置文件如下:rnrnDMISDB100 =rn (DESCRIPTION =rn (ADDRESS_LIST =rn (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))rn )rn (CONNECT_DATA =rn (SERVICE_NAME = DmisDB)rn )rn )rnrn请教高手,这是什么原因啊!!
Socket通讯-C#客户端与Java服务端通讯(发送消息和文件)
项目目的实现C#客户端向Java服务端发送消息以及文件的功能设计思路使用Socket通讯,客户端采用C#开发界面,服务端使用Java开发,最终实现向服务端发送文件和消息的功能。
socket客户端发送消息
sprintf(pMsg,"%s");
socket客户端发送消息问题
现在需求是两个客户端和一个服务端,一个客户端向服务端发送消息,然后服务端再将消息发送给第二个客户端,都是长连接,第一次发送没问题,但是再点发送第二个客户端就收不到消息了,服务器也收不到(下面服务端代码)rn![![![图片说明](https://img-ask.csdn.net/upload/201508/13/1439451531_552012.png)图片说明](https://img-ask.csdn.net/upload/201508/13/1439451550_766409.png)图片说明](https://img-ask.csdn.net/upload/201508/13/1439451511_334640.png)
perl socket 客户端发送消息
use IO::Socket::INET; use Data::Dumper; $|=1; $sock = IO::Socket::INET->new(PeerAddr => '10.3.229.1', PeerPort => '745', P
一个简单的socket客户端发送消息到服务器端程序
最基本的功能,能够帮助初学者初步理解socket
在线急等--oralce客户端连不上服务器问题
我的电脑装了oralce客户端,可以ping通服务器ip(192.168.1.100),但是用pl/sql developer登录不了服务器,错误是:ORA-12535 TNS 操作超时。我连了几次都这样。我的tnsnames.ora配置文件如下:rnrnDMISDB =rn (DESCRIPTION =50rn (ADDRESS_LIST =rn (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))rn )rn (CONNECT_DATA =rn (SERVICE_NAME = DmisDB)rn )rn )rnrn请教高手,这是什么原因啊!!
socket 服务器端向客户端发送消息
服务器端向客户端发送消息、如果客户端连接上服务器、服务器就给客户端发送一组数据、客户端结合客户端数据并与这组数据一起计算、得到一个值后发送给服务器端、服务前端在告诉他计算的是否正确,服务器端两次发的数据不一样,怎么区分出来服务器两次发送的内容、请大家多多指教、谢谢
Swing程序客户端与服务器问题
我写的Swing程序所有业务全部在客户端实现,包括连接数据库,服务器端只有一个数据库。这样貌似不太安全。是不是服务器应该有个像Tomcat类的东东?以处理客户端的请求。至少别让连接数据库的类也放在客户端。这点应该如何做?各位大牛帮帮忙,谢谢!
Socket服务端与客户端通讯
Socket服务端与客户端通讯,实现一对一聊天,详细请看博客文章
Socket 通讯客户端和服务器端
用于客户端和服务器端的通讯,SOcket通讯是必不可少;
socket服务端和客户端通讯
socket服务端和客户端通讯
socket(套接字)通讯,客户端
一个简单的网络同学的客户端,是C++的,实现消息(字符串)发送。
C# Socket客户端通讯
C# SocketClient 与TPC/IP 协议通讯,里面包括二进制转换,编码转换,等技术
Socket 服务器和客户端通讯
这个是C#的Socket 有需要的可以下载看看
TcpSocket通讯和Socket客户端
实现TcpSocket了异步接收事件,原来Socket通讯也是以“太网通讯”,希望能一起学习
socket 服务器和客户端通讯
服务器和客户端的异步通讯 啊啊啊啊 啊啊啊 啊啊啊啊 啊啊嗷嗷啊啊啊啊
阿里云服务器,客户端socket连不上的问题
最近弄了个阿里云的免费试用版,想着把自己的服务丢到阿里云上去试试。原以为这应该是一件比较顺利的事情,却弄了很久才找到原因。 在阿里云上安装完git,将代码拉下去编译完成后,启动服务一切正常。客户端我首先ping一下,也没有问题。注意,这是ping要选用公网地址。但是客户端程序跑起来时候一直在connect的时候失败,想到关闭防火墙,但是好像并没有什么软用。后来网上找了好长时间才发现是端口没有开启...
java socket通讯 服务端如何主动给指定的客户端发送消息?
java socket通讯 服务端如何主动给指定的客户端发送消息?
【Android】Socket通讯示例(服务端/客户端)
概述一个简单的Socket通信示例,用于实现Java服务端与Android客户端间的通讯。 整体逻辑 Server端:新开一个线程,启动Server服务端,使用while监听当前端口是否已经进入阻塞状态,如果进入,则表示有连接请求,进行处理(接收/发送消息,这里我设置的是一次通讯–通讯完毕后关闭服务端); Client端:打开App,输入要发送的内容,点击发送按钮开始新建线程建立So
Socket通讯程序包括客户端和服务端
一个简单的windows下的socket网络通讯程序源代码,包括客户端和服务端两组程序。
C# 实现socket通讯程序(客户端)
要实现客户端与服务器的聊天小程序,其实在客户端就只做三件事,连接、发送、接收,下面是最简单例子的部分代码。其他编程语言实现网络编程也基本是一样的。然后写完客户端,就要写服务端的程序了,下一篇博客出门左拐,传送门: 1、先实例化socket协议,再连接服务器: 关键代码:newclient = new Socket(AddressFamily.InterNetwork, SocketType....
程序客户端连不上服务器
做了个局域网使用的小软件,FB数据库,用IB的数据库连接控件rnrn发布后,绝大多数网内用户使用都没有问题,只有一台电脑连不上,Ping服务器能通,客户端连接报错如下:rnrncan't format message 13:98 -- message system code -4.rnUnable to complete network request to host "10.25.11.93".rnFailed to establish a connection.rnrn请问这是为什么呢?rnrn开始怀疑3050端口,但是据说FB只要带上fbclient.dll,GDS32.DLL,会自动打开端口的,绝大部分客户端连接成功也证明是FB自己打开的,可这一台怎么就不行呢?rnrn求帮助啊!
ssh连不上服务器问题
git pull时git clone时或putty ssh连不上服务器时如果报错(git 报错): ssh_exchange_identification: read: Connection reset by peer fatal: Could not read from remote repository. 这种情况就需要你去排错了首先ssh -v 看看能不能获得什么有用的信息 或者物
有两个客户端,都用socket同服务器通讯,在socket中怎么向指定的客户端发送消息?
有两个客户端,都用socket同服务器通讯,在socket中怎么向指定的客户端发送消息?
BCB服务器发送消息Socket通讯问题
用Socket通讯的时候,当多个client链接到服务器的时候,服务器如何辨别是哪个client发送过来的数据,并作相应的回传?可以向指定的Client发送消息吗?
C# SOCKET通讯 远程打开文件 发送消息 (源码)
用VS2012编写的SOCKET通讯程序,实现了远程客户端请求打开服务器端文件,服务器端命令,相互发送消息等功能,可以下载继续加功能,扩展性较好。代码编写规范化!
SOCKET服务器问题
if(::listen(s, INFINITE) == SOCKET_ERROR) rn rn::WSACleanup(); rnreturn 0; rn rnsockaddr_in remoteAddr; rnint nAddrLen = sizeof(remoteAddr); rnSOCKET client; rnwhile(TRUE) rn rn// 接受一个新连接 rnclient = ::accept(s, (SOCKADDR*)&remoteAddr, &nAddrLen); rnif(client != INVALID_SOCKET) rn::CreateThread(NULL,NULL,Threadrecv,LPVOID(client),0,NULL); rn// 专门建立一个线程为这个连接工作 rn// 关闭同客户端的连接 rn::closesocket(client);或者把他"//"掉都不行 rnrn rn第一次客户端可以connect并且线程正常工作,客户端关闭连接后第二次再连接,无法connect请问为什么啊,应该如何改
socket服务器问题
高分求助rn1:编写一通信服务器(tcp连接),欲采用阻塞模式socket+多线程。原打算为每一个连接创建一个线程但由于客户端过多(3000个左右,该系统特点是在线用户多,但数据量很小),肯定不能按以上做法,希望各位提出较好的改进计划,最好给出源码实例。rn2:系统需要实现以下功能:客户-〉服务器-〉客户,并且需要逆向返回应答,假如采用多线程的阻塞方式,由于服务器每个线程被receive方法阻塞,如何主动下发命令?原来我采用令起线程来下发命令,但现在看来不可行,请问有和解决方案。盼源码。rn多谢各位高人了,我的信箱是hellofire123@yahoo.com.cn ,凡是有突破性方案者一定高分相赠。(由于本有受限制只能给出100分,对于给本人帮助的高手我以后会分贴赠分)。
Socket服务器问题
Socket做服务器时 怎么同时和多个客户端通信,或只对应指定IP的客户端通信??
android socket通讯的问题???
为什么我在使用android socket和PC机通讯的时候在接收数据时出现等待状况,服务器端是在PC机上,客户端是在android平台上,1、如果在客户端上发送数据,则服务器端可以正常接收。2、如果在客户端发送数据然后再接收数据,服务器接收数据就会出现等待状况,请问这是为什么???
android实现socket通讯
Android 实现网络通讯源码,有客户端和服务器端的代码!下载就可以用
Android与PC Socket通讯
Android与PC Socket通讯
android socket通讯实例
android 实现模拟器和pc的socket通讯实例
android socket通讯例子
android代码中socket操作,简易的例子对sokcet通讯。
android简单的socket通讯
****socket 初始化 及心跳包线程 import android.os.Handler; import android.os.Message;import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import
Android Socket通讯问题
用Socket接收数据,点击button启动线程开始接收数据,第一次没有问题,能收到数据,第二次第三次就不行了,连接成功但是没有数据返回,程序正常退出之后再次进入也不行,但是程序异常退出之后第一次点击button接收数据能够成功,之后的又不行了,请问各位前辈该怎么处理
android socket通讯
我想实现以下简单的应用:rn程序需要在MainActivity和SecActivity内调用Socket类,Socket通讯主要实现在MainActivity和SecActivity内发送一个消息到服务器,服务器会自动返回一个处理过后的信息(服务器已经有完整的处理机制,用TCP工具调试通过),在MainActivity和SecActivity内接收到服务器返回的消息;我会在多个类内调用这个socket,这个socket类要怎么写?要怎么在MainActivity和SecActivity内调用?请给出具体的代码;谢谢!
android udp socket通讯
能够进行UDP简单的通讯,具体用处希望各位自己进行扩展。
android socket通讯例子
android socket通讯例子 android socket通讯例子 android socket通讯例子 android socket通讯例子
相关热词 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法 c# gmail 发邮件 c# 多层文件