Простая Java клиент / серверная программа - PullRequest
20 голосов
/ 29 января 2010

Я пишу свою первую программу клиент / сервер на Java, которая просто устанавливает соединение с сервером, отправляет ему предложение, а сервер отправляет предложение с заглавной буквы. Это на самом деле пример прямо из книги, и он хорошо работает, когда я запускаю клиент и сервер на одной машине и использую localhost для адреса сервера. Но когда я помещаю клиентскую программу на другой компьютер, она перестает работать и никогда не устанавливает соединение с сервером. Я не уверен, почему это и делает своего рода неудачным создание вашей первой клиент-серверной программы, и я не могу использовать ее на двух разных машинах. Вот код клиента:

import java.io.*;
import java.net.*;

public class TCPClient {
    public static void main(String argv[]) throws Exception {
        String sentence;
        String modifiedSentence;
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));

        Socket clientSocket = new Socket("localhost", 6789);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        sentence = inFromUser.readLine();
        outToServer.writeBytes(sentence + '\n');
        modifiedSentence = inFromServer.readLine();
        System.out.println(modifiedSentence);
        clientSocket.close();
    }
}

Вот код сервера:

import java.io.*;
import java.net.*;

public class TCPServer {
    public static void main(String args[]) throws Exception {
        String clientSentence;
        String capitalizedSentence;
        ServerSocket welcomeSocket = new ServerSocket(6789);

        while(true) {
            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
            clientSentence = inFromClient.readLine();
            capitalizedSentence = clientSentence.toUpperCase() + '\n';
            outToClient.writeBytes(capitalizedSentence);
        }
    }
}

Единственное, что я изменяю, когда запускаю его на двух разных машинах, это то, что клиентская программа создает свой сокет с IP-адресом машины с помощью серверной программы (которую я получил с whatismyipaddress.com). Большое спасибо за любую помощь.

Обновление: я действительно нахожусь в университетском городке, и кажется, что это, вероятно, не позволяет мне использовать этот случайный порт. Любые предложения по выяснению, какой порт я могу использовать и / или порт, который более чем допустим?

Ответы [ 9 ]

8 голосов
/ 29 января 2010

Вероятно, это проблема брандмауэра. Убедитесь, что вы перенаправили порт, к которому хотите подключиться, на стороне сервера. localhost сопоставляется напрямую с ip, а также перемещается через ваш сетевой стек. Вы изменяете некоторый текст в своем коде, но способ работы вашей программы в основном тот же.

3 голосов
/ 13 июня 2013

Существует фундаментальная концепция IP-маршрутизации: у вас должен быть уникальный IP-адрес, если вы хотите, чтобы ваша машина была доступна через Интернет. Это называется «публичный IP-адрес». "www.whatismyipaddress.com" даст вам это. Если ваш сервер находится за шлюзом по умолчанию, IP-пакеты будут доставляться вам через этот маршрутизатор. Вы не можете быть достигнуты через ваш частный IP-адрес из внешнего мира. Следует помнить, что частные IP-адреса клиента и сервера могут быть одинаковыми, если их соответствующие шлюзы по умолчанию имеют разные адреса (поэтому IPv4 все еще действует) Я предполагаю, что вы пытаетесь пропинговать ваш личный адрес вашего клиента общедоступному IP-адресу сервера (предоставлен whatismyipaddress.com). Это неосуществимо. Чтобы достичь этого, требуется преобразование из частного в публичный адрес, процесс, называемый преобразованием сетевых адресов или, вкратце, NAT. Это настраивается в брандмауэре или маршрутизаторе. Вы можете создать свою собственную частную сеть (скажем, через Wi-Fi). В этом случае, поскольку ваш клиент и сервер будут находиться в одной и той же логической сети, преобразование частного в публичный адрес не потребуется, и, следовательно, вы можете общаться только с использованием своих частных IP-адресов.

1 голос
/ 30 января 2010

Вместо того, чтобы использовать IP-адрес с сайта whatismyipaddress.com, что если вы просто получите IP-адрес непосредственно с компьютера и подключите его? whatismyipaddress.com даст вам адрес вашего роутера (я предполагаю, что вы находитесь в домашней сети). Я не думаю, что переадресация портов будет работать, так как ваш запрос будет поступать изнутри сети, а не снаружи.

1 голос
/ 30 января 2010

Если вы получили свой IP-адрес с внешнего веб-сайта (http://whatismyipaddress.com/),, у вас есть внешний IP-адрес. Если ваш сервер находится в той же локальной сети, вам может понадобиться внутренний IP-адрес. Локальные IP-адреса выглядят как 10.XXX, 172.XXX или 192.168.XX

Попробуйте предложения по на этой странице , чтобы узнать, что ваш аппарат считает своим IP-адресом.

0 голосов
/ 11 марта 2016
import java.io.*;
import java.net.*;
class serversvi1
{
  public static void main(String svi[]) throws IOException
  {
    try
    {
      ServerSocket servsock=new ServerSocket(5510);
      DataInputStream dis=new DataInputStream(System.in);

      System.out.println("enter the file name");

      String fil=dis.readLine();
      System.out.println(fil+" :is file transfer");

      File myfile=new File(fil);
      while(true)
      {
        Socket sock=servsock.accept();
        byte[] mybytearray=new byte[(int)myfile.length()];

        BufferedInputStream bis=new BufferedInputStream(new FileInputStream(myfile));

        bis.read(mybytearray,0,mybytearray.length);

        OutputStream os=sock.getOutputStream();
        os.write(mybytearray,0,mybytearray.length);
        os.flush();

        sock.close();
      }
    }
    catch(Exception saranvi)
    {
      System.out.print(saranvi);
    }
  }
}


import java.io.*;
import java.net.*;

class clientsvi1
{
  public static void main(String svi[])throws IOException
  {
    try
    {
      Socket sock=new Socket("localhost",5510);
      byte[] bytearray=new byte[1024];

      InputStream is=sock.getInputStream();
      DataInputStream dis=new DataInputStream(System.in);
      System.out.println("enter the file name");

      String fil=dis.readLine();
      FileOutputStream fos=new FileOutputStream(fil);
      BufferedOutputStream bos=new  BufferedOutputStream(fos);
      int bytesread=is.read(bytearray,0,bytearray.length);
      bos.write(bytearray,0,bytesread);
      System.out.println("out.txt file is received");
      bos.close();
      sock.close();
    }
    catch(Exception SVI)
    {
      System.out.print(SVI);
    }
  }
}
0 голосов
/ 26 января 2015

это код клиента

сначала запустите серверную программу, затем на другой клиентской программе cmd run

import java.io.*;
import java.net.*;

public class frmclient 
{
 public static void main(String args[])throws Exception
 {

   try
        {
          DataInputStream d=new DataInputStream(System.in);
          System.out.print("\n1.fact\n2.Sum of digit\nEnter ur choice:");

           int ch=Integer.parseInt(d.readLine());
           System.out.print("\nEnter number:");
           int num=Integer.parseInt(d.readLine());

           Socket s=new Socket("localhost",1024);

           PrintStream ps=new PrintStream(s.getOutputStream());
           ps.println(ch+"");
           ps.println(num+"");

          DataInputStream dis=new DataInputStream(s.getInputStream());
           String response=dis.readLine();
                 System.out.print("Answer:"+response);


                s.close();
        }
        catch(Exception ex)
        {

        }
 }


}

это код боковой стороны

import java.io.*;
import java.net.*;
public class frmserver {

  public static void main(String args[])throws Exception
  {

try
    {

    ServerSocket ss=new ServerSocket(1024);
       System.out.print("\nWaiting for client.....");
       Socket s=ss.accept();
       System.out.print("\nConnected");

       DataInputStream d=new DataInputStream(s.getInputStream());

        int ch=Integer.parseInt(d.readLine());
       int num=Integer.parseInt(d.readLine());
         int result=0;

        PrintStream ps=new PrintStream(s.getOutputStream());
        switch(ch)
        {
          case 1:result=fact(num);
                 ps.println(result);
                  break;
          case 2:result=sum(num);
                 ps.println(result);
                  break;
        }

          ss.close();
          s.close();
    }
catch(Exception ex)
{

}
  }

  public static int fact(int n)
  {
  int ans=1;
    for(int i=n;i>0;i--)
    {
      ans=ans*i;
    }
    return ans;
  }
  public static int sum(int n)
  {
   String str=n+"";
   int ans=0;
    for(int i=0;i<str.length();i++)
    {
      int tmp=Integer.parseInt(str.charAt(i)+"");
      ans=ans+tmp;
    }
    return ans;
  }
}
0 голосов
/ 30 октября 2014

Моя попытка сделать программу клиентского сокета

сервер читает файл и распечатывает его на консоль и копирует его в выходной файл

Серверная программа:

package SocketProgramming.copy;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerRecieveFile {
    public static void main(String[] args) throws IOException {
        // TODO Auto-enerated method stub
        int filesize = 1022386;
        int bytesRead;
        int currentTot;
        ServerSocket s = new ServerSocket(0);
        int port = s.getLocalPort();
        ServerSocket serverSocket = new ServerSocket(15123);
        while (true) {
            Socket socket = serverSocket.accept();
            byte[] bytearray = new byte[filesize];
            InputStream is = socket.getInputStream();
            File copyFileName = new File("C:/Users/Username/Desktop/Output_file.txt");
            FileOutputStream fos = new FileOutputStream(copyFileName);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            bytesRead = is.read(bytearray, 0, bytearray.length);
            currentTot = bytesRead;
            do {
                bytesRead = is.read(bytearray, currentTot,
                        (bytearray.length - currentTot));
                if (bytesRead >= 0)
                    currentTot += bytesRead;
            } while (bytesRead > -1);
            bos.write(bytearray, 0, currentTot);
            bos.flush();
            bos.close();
            socket.close();
        }
    }
}

Клиентская программа:

package SocketProgramming.copy;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientSendFile {
    public static void main(String[] args) throws UnknownHostException,
            IOException {
        // final String FILE_NAME="C:/Users/Username/Desktop/Input_file.txt";
        final String FILE_NAME = "C:/Users/Username/Desktop/Input_file.txt";
        ServerSocket s = new ServerSocket(0);
        int port = s.getLocalPort();
        Socket socket = new Socket(InetAddress.getLocalHost(), 15123);
        System.out.println("Accepted connection : " + socket);
        File transferFile = new File(FILE_NAME);
        byte[] bytearray = new byte[(int) transferFile.length()];
        FileInputStream fin = new FileInputStream(transferFile);
        BufferedInputStream bin = new BufferedInputStream(fin);
        bin.read(bytearray, 0, bytearray.length);
        OutputStream os = socket.getOutputStream();
        System.out.println("Sending Files...");

        os.write(bytearray, 0, bytearray.length);

        BufferedReader r = new BufferedReader(new FileReader(FILE_NAME));
        String as = "", line = null;
        while ((line = r.readLine()) != null) {
            as += line + "\n";
            // as += line;

        }
        System.out.print("Input File contains following data: " + as);
        os.flush();
        fin.close();
        bin.close();
        os.close();
        socket.close();

        System.out.println("File transfer complete");
    }
}
0 голосов
/ 06 сентября 2014

вы можете получить ip того компьютера, который запускает серверную программу из списка DHCP на том маршрутизаторе, к которому вы подключены.

0 голосов
/ 18 марта 2014

Аутстрим не закрыт ... закройте поток, чтобы ответ вернулся к тестовому клиенту. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...