【问题标题】:Java sockets, sending data to and from?Java 套接字,来往来往发送数据?
【发布时间】:2012-10-12 18:53:24
【问题描述】:

好的,我正在尝试设置一个程序,我必须从套接字接收数据,并将数据发送到套接字。我很难理解如何让套接字的客户端发送特定数据,然后让服务器端发送特定数据。这是我目前拥有的,它只是我的服务器端,因为到目前为止我真的迷失在客户端部分。

为了进一步评估,我想按照下面列出的方法做,但我不知道要研究什么来编写套接字的客户端,如果有任何代码我需要重写服务器端?

package sockets;
import java.net.*;
import java.io.*;

public class SocketMain {
    private int port = 0;
    public ServerSocket socket;
    public Socket clientSock;

    public SocketMain() {
        init();
    }

    public static void main(String[] args) {
        new SocketMain();
    }

    private void init() {
        try { 
            socket = new ServerSocket(port);
            System.out.println("Server started, bound to port: "+port);
            clientSock = socket.accept();
            File directory = new File("./Storage/");
            if (!directory.exists()) {
                directory.mkdirs();
            }
            File file = new File(directory + "/Store.dat");
            if (!file.exists()) {
                file.createNewFile();
            }
            DataInputStream in = new DataInputStream(clientSock.getInputStream());  
            FileWriter fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw);
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
                bw.write(line+"\n");
                bw.flush();
                bw.close();
            }
            socket.close();
            clientSock.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

【问题讨论】:

  • 为什么要捕获 IOException?
  • 您有什么特别的问题吗?你到底卡在哪里了?
  • 抱歉,我添加了一张图片来帮助解释我需要做什么,我很好奇如何在客户端指定数据以供服务器读取。

标签: java sockets io


【解决方案1】:

除此之外,我看不出您的代码有任何明显错误:

DataInputStream in = new DataInputStream(clientSock.getInputStream());  
while ((line = in.readLine()) != null) {

DataInputStream.getLine() 已弃用 - 您应该只使用 BufferedReader.getLine():

使用 DataInputStream 类读取行的程序可以通过替换形式的代码转换为使用 BufferedReader 类:

DataInputStream d = new DataInputStream(in);

与:

BufferedReader d  = new BufferedReader(new InputStreamReader(in));

【讨论】:

    【解决方案2】:

    关于你目前拥有的:

    首先映入我眼帘的是这个循环:

    while ((line = in.readLine()) != null) {
        System.out.println(line);
        bw.write(line+"\n");
        bw.flush();
        bw.close(); // <- Problem
    }
    

    每次写一行时,您都会关闭编写器。现在,正如Writer.close() 的文档所述:

    关闭流,首先刷新它。 一旦流已经 关闭,进一步的 write() 或 flush() 调用将导致 要抛出 IOException。 关闭之前关闭的流没有 效果。

    您应该在第一行之后的每一行都获得IOExceptions。但是,您的程序不会崩溃,因为您正在捕获异常。


    其次,您使用DataInputStream 从您的客户端读取,但使用BufferedWriter 写出。正如it's documentation 中的前者所说:

    数据输入流允许应用程序读取原始 Java 数据类型 以与机器无关的方式从底层输入流。一个 应用程序使用数据输出流写入数据,以后可以 由数据输入流读取。

    该类包括布尔、char、int 以及您能想到的任何原始数据类型的多种方法。但是对于DataInputStream.readLine()-method,它明确指出:

    已弃用此方法不能正确地将字节转换为字符。 从 JDK 1.1 开始,阅读文本行的首选方式是通过 BufferedReader.readLine() 方法。

    因此,对于读取字符串,您应该使用BufferedReader


    关于你还没有的:

    通过套接字的通信建立在“问-答”基础上。工作流程应该是这样的:

    1. 客户端打开连接
    2. 服务器接受连接
    3. 客户端请求某些东西(使用服务器套接字OutputStream
    4. 服务器读取请求(使用客户端套接字InputStream
    5. 服务器回答(使用客户端套接字OutputStream
    6. 客户端读取答案(使用服务器套接字InputStream
    7. 如有必要,重复步骤 3-6。
    8. 连接已关闭(由客户端、服务器或两者)。

    【讨论】:

    • 非常感谢,这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2015-04-02
    • 2013-06-18
    相关资源
    最近更新 更多