socket closed异常 怎么解决

萌迪 2017-04-25 11:04:09
package com.example.client;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {
private Button btnConnect;
private Button btnSend;
private EditText etIp;
private EditText etText;
private ListView listView;
private List<String> messages = new ArrayList<String>();
private ArrayAdapter<String> adapter;
private Socket socket;
// private DataInputStream dis;
// private DataOutputStream dos;

//主线程中创建handler对象
private Handler handler = new Handler(){
//handler自动调用 当消息队列中有消息对象时
//将会调用该方法 处理这个消息
public void handleMessage(android.os.Message msg) {
//处理消息 这个方法在主线程中执行
switch (msg.what) {
case HANDLER_MESSAGE_RECEIVED: //接收到了消息
adapter.notifyDataSetChanged();
//永远看到最后一条
listView.setSelection(messages.size()-1);
break;
case HANDLER_CONNECT_SUCCESS: //接收到了连接成功的消息
Toast.makeText(MainActivity.this, "恭喜!建立连接成功!", Toast.LENGTH_SHORT).show();
etIp.setEnabled(false);
btnConnect.setEnabled(false);
break;
case HANDLER_CONNECT_FAIL: //接收到了连接失败的消息
Toast.makeText(MainActivity.this, "恭喜!建立连接失败!", Toast.LENGTH_SHORT).show();
break;
}
}
};

public static final int HANDLER_CONNECT_SUCCESS=0;
public static final int HANDLER_CONNECT_FAIL=1;
public static final int HANDLER_MESSAGE_RECEIVED=2;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//控件初始化
setViews();
//给listView设置适配器
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, messages);
listView.setAdapter(adapter);
}

/** 控件初始化 */
private void setViews() {
btnConnect = (Button) findViewById(R.id.btnConnect);
btnSend = (Button) findViewById(R.id.btnSend);
listView = (ListView) findViewById(R.id.listView);
etIp = (EditText) findViewById(R.id.etIp);
etText = (EditText) findViewById(R.id.etText);
}

public void doClick(View view){
switch (view.getId()) {
case R.id.btnConnect: //建立连接
connect();
break;
case R.id.btnSend: //发送消息
sendMessage();
break;
}
}
private BufferedWriter buffWr = null;
private BufferedReader buff;
protected OutputStream ops;
protected OutputStreamWriter opsw;
protected BufferedWriter bw;
/** 发送消息 */
private void sendMessage() {
new Thread(){
public void run() {
try {
//把文本框中的内容获取到 发消息
String text = etText.getText().toString();
bw.write("梦迪:\n"+text);
bw.flush();
// bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}

/** 建立网络连接 */
private void connect() {
new Thread(){
public void run() {
try {
socket = new Socket("192.168.1.185", 7080);
InputStream fileInputStream=socket.getInputStream();
InputStreamReader inputStreamReader=new InputStreamReader(fileInputStream);
BufferedReader bufferedWriter2=new BufferedReader(inputStreamReader);
ops = socket.getOutputStream();
opsw = new OutputStreamWriter(ops,"UTF-8");
bw = new BufferedWriter(opsw);
//不出异常 说明连接建立成功
//给handler发送一个连接成功的消息
Message msg = new Message();
msg.what = HANDLER_CONNECT_SUCCESS;
handler.sendMessage(msg);
//启动子线程 用于不断读取服务端的消息
new ReadThread().start();
} catch (IOException e) {
e.printStackTrace();
//连接创建失败 提示用户
handler.sendEmptyMessage(HANDLER_CONNECT_FAIL);
}
}
}.start();
}

/** 专门用于读取服务端返回的消息 */
public class ReadThread extends Thread{
public void run() {
try{
while(buff.readLine()!=null){
String message=buff.readLine();
Log.i("info", "接收到了消息:"+message);
//把消息添加到消息集合中
messages.add(message);
//更新ListView的适配器
handler.sendEmptyMessage(HANDLER_MESSAGE_RECEIVED);
}
}catch(Exception e){
e.printStackTrace();
}
}
}

}


连接成功后,发消息报异常
服务端启动
LAPTOP-3L84R6L0:连接成功!
LAPTOP-3L84R6L0/192.168.1.185:java.io.BufferedReader@4e25154f说
:姊﹁开锛?
Exception in thread "main" java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at cn.tedu.Server.main(Server.java:27)
...全文
3616 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
应该是你读取的线程出问题了

80,360

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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