如何在java中保持连接套接字

时间:2018-07-20 05:43:44

标签: sockets

我通过套接字编程了多连接(客户端-服务器)

连接多台服务器时, 文件未传输,但客户端显示错误消息。 我应该在您的客户端中使用线程吗?

client.java

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class client {
    public static void main(String[] args) {

        try {
            while (true) {
                Socket sock = new Socket("192.168.0.77", 9999);
                // Socket sock = new Socket("127.0.0.1", 9999);
                // Socket sock = new Socket("127.0.0.1", 9999);
                System.out.println("connection");
                Scanner scan = new Scanner(System.in);
                System.out.print("file name : ");

                String fileName = scan.next();
                File f = new File(fileName);

                DataOutputStream dos = new DataOutputStream(sock.getOutputStream());

                dos.writeUTF(f.getName());
                dos.flush();
                byte b[] = new byte[1024];
                int n = 0;

                FileInputStream fis = new FileInputStream(fileName);
                long fileSize = 0;

                while ((n = fis.read(b)) != -1) {
                    dos.write(b, 0, n);
                    fileSize += n;
                }
                System.out.println("Transfer completed");
                dos.close();
                fis.close();

                sock.close();
            }

        } catch (UnknownHostException ue) {
            //System.out.println(ue.getMessage());
        } catch (IOException ie) {
            System.out.println(ie.getMessage());

        }
    }

}

server.java

import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class server {
   public static void main(String[] args) {
      ServerSocket server = null;
      // final int Server_port = 9999;

      DataInputStream dis = null;
      String fileName = null;
      FileOutputStream fos = null;

      try {
         /*
          * server = new ServerSocket(); String localHostAddress =
          * InetAddress.getLocalHost().getHostAddress(); server.bind(new
          * InetSocketAddress(localHostAddress, Server_port));
          * System.out.println("[server] binding \naddress : " + localHostAddress +
          * ", port : " + Server_port);
          */

         /*
          * InetSocketAddress remoteSocketAddress = (InetSocketAddress)
          * socket.getRemoteSocketAddress(); String remoteHostName =
          * remoteSocketAddress.getAddress().getHostAddress(); int remoteHostPort =
          * remoteSocketAddress.getPort();
          * System.out.println("[server] connected! \nconnected socket address:" +
          * remoteHostName + ", port:" + remoteHostPort);
          */

         while (true) {
            server = new ServerSocket(9999);
            AcceptThread acceptThread = new AcceptThread (server);



            System.out.println("wait");
            Socket sock = server.accept();
            System.out.println("Client accept");

            new Thread(acceptThread).start();

            dis = new DataInputStream(sock.getInputStream());

            // if (dis.available() > 0) {
            fileName = dis.readUTF();
            fos = new FileOutputStream(fileName);
            byte[] b = new byte[1024];
            int n = 0;
            long fileSize = 0;

            while ((n = dis.read(b)) != -1) {
               fos.write(b, 0, n);
               fileSize += n;
            }
            System.out.println("accepted");

            fos.close();
            dis.close();


            sock.close();
            server.close();

         }
         // }
      } catch (IOException ie) {
         System.out.println(ie.getMessage());
      }

   }

}

AcceptThread.class

import java.net.*;

public class AcceptThread extends Thread {

   ServerSocket server;
   Socket sock;

   public AcceptThread(ServerSocket server) {
      this.server = server;
   }

   @Override
   public void run() {
      while (true) {
         try {
            sock = server.accept();
            System.out.println("connected client" + sock);
         } catch (Exception e) {
         }
      }

   }

}

它给我客户端一个错误

Connection reset by peer: socket write error

我想知道如何将多客户端连接到服务器

您能否提供链接或一些提示/示例?

1 个答案:

答案 0 :(得分:0)

您使用DataOutputStream发送名称,但是file.getName()是字符串!转换为字节数组like this