有关客户端与服务器端通信的问题

问题描述

写了一段服务器端和客户端通信代码,实现以下功能:客户端将文件发送到服务器端,服务器端接收完文件后给客户端发送一个消息。运行代码后出现以下问题不知如何神马原因:客户端文件可以正确地传到服务器端,但是服务器端接收完文件后发送给客户端地确认消息,客户端收不到,报java.net.SocketException: Socket is closed的异常,请各位帮忙看看客户端代码package client;import java.io.*;import java.net.*;public class ClientThread extends Thread{private int hostPort=3000;protected BufferedReader socketReader; protected PrintWriter socketWriter; private BufferedReader streamReader;public ClientThread(){setUpConnection();}public void setUpConnection() { try { Socket client = new Socket("127.0.0.1", hostPort); //socketWriter = new PrintWriter(client.getOutputStream());InputStream inputFromSocket = client.getInputStream();streamReader = new BufferedReader(new InputStreamReader(inputFromSocket));handleConnection(client);} catch (UnknownHostException e) { System.out.println("Error setting up socket connection: unknown host"); } catch (IOException e) { System.out.println("Error setting up socket connection: " + e); } } public void handleConnection(Socket client) {try {File file=new File("a.txt");FileReader fileReader = new FileReader(new File("a.txt"));BufferedReader bufferedFileReader = new BufferedReader(fileReader);PrintWriter streamWriter = new PrintWriter(client.getOutputStream());String line = null;while ((line = bufferedFileReader.readLine()) != null) {streamWriter.println(line);}fileReader.close();streamWriter.close();//////读取服务器收到文件后的返回内容String str=streamReader.readLine();while(str!=null){System.out.println(str);}} catch (Exception e) {System.out.println("Error handling a client: " + e);}} }服务器端代码import java.net.*;import java.io.*;public class ServerThread extends Thread{private int listenPort = 3000;public ServerThread(){acceptConnections();}public void acceptConnections() {try {ServerSocket server = new ServerSocket(listenPort);Socket incomingConnection = null;while (true) {incomingConnection = server.accept();handleConnection(incomingConnection);}} catch (BindException e) {System.out.println("Unable to bind to port " + listenPort);} catch (IOException e) {System.out.println("Unable to instantiate a ServerSocket on port: "+ listenPort);}}public void handleConnection(Socket incomingConnection) {try {BufferedReader socketReader = new BufferedReader( new InputStreamReader(incomingConnection.getInputStream())); String line = null;while ((line = socketReader.readLine()) != null) {//streamWriter.println(line);System.out.println(line);}socketReader.close();/////////接受完服务器发送的文件后给客户端OutputStream os=incomingConnection.getOutputStream();os.write("".getBytes());} catch (Exception e) {System.out.println("Error handling a client: " + e);}}} 问题补充:Rainbow702 写道

解决方案

给你修改了一下,可以正常运行:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.BindException;import java.net.ServerSocket;import java.net.Socket;public class ServerThread extends Thread {private int listenPort = 30000;public ServerThread() {acceptConnections();}public void acceptConnections() {try {ServerSocket server = new ServerSocket(listenPort);Socket incomingConnection = null;int i=1;while (true) {System.out.println("i= " + (i++));incomingConnection = server.accept();handleConnection(incomingConnection);}} catch (BindException e) {System.out.println("Unable to bind to port " + listenPort);e.printStackTrace();} catch (IOException e) {System.out.println("Unable to instantiate a ServerSocket on port: "+ listenPort);}}public void handleConnection(Socket incomingConnection) {try {BufferedReader socketReader = new BufferedReader(new InputStreamReader(incomingConnection.getInputStream()));String line = null;while (!(line = socketReader.readLine()).equals("xxx")) {// streamWriter.println(line);System.out.println(line);}//socketReader.close();// ///////接受完服务器发送的文件后给客户端OutputStream os = incomingConnection.getOutputStream();os.write("message arriveredn".getBytes());os.write("n".getBytes());os.flush();System.out.println("handleConnection() is over");} catch (Exception e) {System.out.println("Error handling a client: " + e);}}public static void main(String[] args) {new ServerThread().start();}}import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class ClientThread extends Thread{private int hostPort = 30000;protected BufferedReader socketReader;protected PrintWriter socketWriter;private BufferedReader streamReader;public ClientThread() {setUpConnection();}public void setUpConnection() {try {Socket client = new Socket("127.0.0.1", hostPort);// socketWriter = new PrintWriter(client.getOutputStream());InputStream inputFromSocket = client.getInputStream();streamReader = new BufferedReader(new InputStreamReader(inputFromSocket));handleConnection(client);} catch (UnknownHostException e) {System.out.println("Error setting up socket connection: unknown host");} catch (IOException e) {System.out.println("Error setting up socket connection: " + e);}}public void handleConnection(Socket client) {try {File file = new File("src/test.txt");FileReader fileReader = new FileReader(file);BufferedReader bufferedFileReader = new BufferedReader(fileReader);PrintWriter streamWriter = new PrintWriter(client.getOutputStream());String line = null;while ((line = bufferedFileReader.readLine()) != null) {streamWriter.println(line);}streamWriter.println("xxx");streamWriter.flush();fileReader.close();// 此处不能断,否则就断开了与服务器的 socket 连接// streamWriter.close();// ////读取服务器收到文件后的返回内容String str;while ((str = streamReader.readLine()) != null && !str.equals("")) {System.out.println(str);}System.out.println("client thread is over");} catch (Exception e) {System.out.println("Error handling a client: " + e);e.printStackTrace();}}public static void main(String[] args) {new ClientThread().start();}}
解决方案二:
另外判断一个文件是否读完,不能通过是否读取到了 null 来判断,而是应该使用特地的结束符来判断
解决方案三:
引用streamWriter.close();关键是你上面这句代码的问题,通过源码可以看出 public void close() {try { synchronized (lock) {if (out == null) return;out.close();out = null; }}catch (IOException x) { trouble = true;} }会把 out 关闭且置为 null,那么 out 是什么呢?引用PrintWriter streamWriter = new PrintWriter(client.getOutputStream());上面是你的代码。去看一下 PrintWriter 的源码便知:public PrintWriter(OutputStream out) {this(out, false); }public PrintWriter(OutputStream out, boolean autoFlush) {this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush);// save print stream for error propagationif (out instanceof java.io.PrintStream) { psOut = (PrintStream) out;} }public PrintWriter(Writer out, boolean autoFlush) {super(out);this.out = out;this.autoFlush = autoFlush;lineSeparator = (String) java.security.AccessController.doPrivileged( new sun.security.action.GetPropertyAction("line.separator")); }可见,这个 out 就是你通过 socket 得到的 getOutputStream,那么怎么才能将这个 getOutputStream 关闭呢,当然就是断开这个 socket 啦,所以,你会一直得到这个异常
解决方案四:
那把 Thread.sleep(2000); 的时间设置成更大一点。另外,你的 客户端 与 服务端 是分开启动的吧?
解决方案五:
初步推测:引用//////读取服务器收到文件后的返回内容 String str=streamReader.readLine(); while(str!=null){ System.out.println(str); } 这个操作在服务器返回有效结果前已经被执行过,导致客户端的 Thread 的线程执行完毕,从而断开发与服务器的连接(从而可能导致服务器还没有把文件接收结束就已经报了这个异常)。你可以在上面的操作之前加个Thread.sleep(2000);来模拟一下服务器返回结果的延迟效果,看看还能不能收到结果
解决方案六:
引用java.net.SocketException: Socket is closed是哪一行报的错啊?

时间: 2025-01-29 20:27:03

有关客户端与服务器端通信的问题的相关文章

c#客户端和服务器端通信问题

问题描述 c#客户端和服务器端通信问题 服务端ip:192.168.1.214.客户端ip:192.168.1.30 客户端代码public static void ReceiveStart(string localip, string localPort) { try { //创建接受套接字 IPAddress localIP = IPAddress.Parse(localip); IPEndPoint localIPEndPoint = new IPEndPoint(localIP, int

vb.net怎样实现多客户端与服务器端通信

问题描述 ImportsSystem.Net.SocketsImportsSystem.NetImportsSystem.ThreadingImportsSystem.TextPublicClassUsingAsyncSocketServerDimstrMessageAsStringDimmyListenerAsSocketDimbteAccept(65536)AsByteDimbteSend(65536)AsByteDimEndSocketAsSocketDimmyThread1AsThrea

Android实现蓝牙客户端与服务器端通信示例

一.首先说明:蓝牙通信必须用手机测试,因为avd里没有相关的硬件,会报错! 好了,看看最后的效果图: 二.概述: 1.判断是否支持Bluetooth BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if(bluetoothAdapter == null) { //the device doesn't support bluetooth } else { //the device support b

通过TCP进行客户端与服务器端通信

问题描述 为何只能进行单方通信?无法进行双方通信?????求大神解救!!!!!!!!!!packageswing;importjava.awt.BorderLayout;importjava.awt.Color;importjava.awt.Container;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.BufferedReader;importjava.io.IOExcep

java多线程实现服务器端与多客户端之间的通信_java

用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰. 应用多线程来实现服务器与多线程之间的通信的基本步骤 服务器端创建ServerSocket,循环调用accept()等待客户端链接 客户端创建一个Socket并请求和服务器端链接 服务器端接受客户端请求,创建socekt与该客户端建立专线链接 建立链接的socket在一个单独的线程上对话 服务器继续等待新的链接 服务器端Server.java package test.concurrent.socke

php-androi客户端与服务器端的通信问题

问题描述 androi客户端与服务器端的通信问题 我用php写的服务器端, 我想要实现这么一个功能. 假设一共有4台android客户端,每一个客户端都向服务器传两个值(id,value),然后服务器再把所有接收到的值返回给每一个客户端,由此来形成一个数据共享. 从客户端传值到服务器我已经实现了,现在的问题就是怎么把服务器的所有(id,value)数据对返回给android客户端? 解决方案 http无状态 所以要用到比轮循更高级的"push技术" 解决方案二: socket连接 ud

安卓客户端与服务器端有哪些通信方式?

问题描述 安卓客户端与服务器端有哪些通信方式? 安卓客户端与服务器端有哪些通信方式各有什么优缺点怎么根据项目的实际情况选择啊? 或者有什么相关资料推荐也好. 马上毕业小白一个在此先谢谢各位大侠. 解决方案 安卓客户端与服务器端的通信方法主要有长连接和短连接.短连接:是指客户端与服务器通讯双方有数据交互时才建立一个连接,数据发送完毕后就断开此连接,如:http协议.基于该协议的框架如:httpclient长连接:是指客户端与服务器之间始终建立着一个通讯连接,在该连接没有中断之前,客户端与服务器端之

反向Ajax:Comet用于服务器与客户端之间响应通信的流和长轮询

客户端的示例使用的是 jQuery http://www.aliyun.com/zixun/aggregation/33906.html">JavaScript 库.在这首篇文章中,我们探索不同的反向 Ajax 技术,使用可下载的例子来学习使用了流 (streaming) 方法和长轮询 (long polling) 方法的 Comet. Web 开发在过去的几年中有了很大的进展,我们已经远超了把静态网页链接在一起的做法,这种做法会引起浏览器的刷新,并且要等待页面的加载.现在需要的是能够通过

问一个笼统的问题,ios客户端和服务器通信都有什么方法

问题描述 问一个笼统的问题,ios客户端和服务器通信都有什么方法 ios客户端和服务器通信时都有那些方法?那种比较好用或最常用的? 解决方案 ios设备的网络通信的方法,有如下两个大类: 1.使用socket的方式进行通信. 2.使用asynsocket类库进行通信. 两种方法当中,我觉得asynsocket更好,因为是别人已经封装好的类库,比较稳定.但是对于直接使用socket的通信方法我倒是觉得很灵活.因为控制都是自己在做的事情. 先列举集中不同的使用方法: 1.直接使用socket的方式.