Простая Java-клиентская/серверная программа
Я пишу свою первую клиентскую/серверную программу 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). Большое спасибо за любую помощь.
Обновление: я действительно нахожусь в кампусе, и кажется, что он, вероятно, не позволяет мне использовать этот случайный порт. Любые предложения по выяснению, какой порт я могу использовать, или порт, который более чем вероятно разрешен?
Ответы
Ответ 1
Вероятно, это проблема с брандмауэром. Убедитесь, что вы переносите порт, к которому хотите подключиться, на стороне сервера. localhost преобразуется непосредственно в ip, а также перемещается через сетевой стек. Вы меняете текст в своем коде, но то, как работает ваша программа, принципиально одинаково.
Ответ 2
Существует фундаментальная концепция IP-маршрутизации: у вас должен быть уникальный IP-адрес, если вы хотите, чтобы ваша машина была доступна через Интернет. Это называется "Public IP Address". "www.whatismyipaddress.com" даст вам это. Если ваш сервер находится за некоторым шлюзом по умолчанию, IP-пакеты будут доступны вам через этот маршрутизатор. Вы не можете связаться с вашим личным IP-адресом из внешнего мира. Следует отметить, что частные IP-адреса клиента и сервера могут быть такими же, пока их соответствующие шлюзы по умолчанию имеют разные адреса (почему IPv4 все еще действует)
Наверное, вы пытаетесь выполнить ping с вашего личного адреса своего клиента на общедоступный IP-адрес сервера (предоставленный whatismyipaddress.com). Это невозможно. Чтобы достичь этого, требуется сопоставление от частного к общедоступному адресу, короткое преобразование "Трансляция сетевых адресов" или NAT. Это настроено в Firewall или Router.
Вы можете создать свою собственную сеть (скажем, через Wi-Fi). В этом случае, поскольку ваш клиент и сервер будут в одной и той же логической сети, нет необходимости в преобразовании частного адреса в общедоступный адрес и, следовательно, вы можете общаться только с помощью личных IP-адресов.
Ответ 3
Если вы получили свой IP-адрес с внешнего веб-сайта (http://whatismyipaddress.com/), у вас есть внешний IP-адрес. Если ваш сервер находится в одной локальной сети, вам может потребоваться внутренний IP-адрес. Локальные IP-адреса выглядят как 10.X.X.X, 172.X.X.X или 192.168.X.X.
Попробуйте предложить эту страницу, чтобы узнать, что ваш компьютер считает своим IP-адресом.
Ответ 4
Вместо того, чтобы использовать IP-адрес от whatismyipaddress.com, что делать, если вы просто получите IP-адрес непосредственно с компьютера и подключите его? whatismyipaddress.com предоставит вам адрес вашего маршрутизатора (я предполагаю, что вы в домашней сети). Я не думаю, что переадресация портов будет работать, поскольку ваш запрос будет поступать из сети, а не извне.
Ответ 5
Outstream не закрыт... закройте поток, чтобы ответ возвращался к тестовому клиенту.
Надеюсь, это поможет.
Ответ 6
вы можете получить ip этого компьютера, запускающего серверную программу из списка DHCP в том маршрутизаторе, к которому вы подключились.
Ответ 7
Моя попытка выполнить программу клиентского сокета
сервер считывает файл и печатает его на консоль и копирует его в выходной файл
Серверная программа:
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");
}
}
Ответ 8
это код клиента
сначала запустите программу сервера, затем в другой клиентской программе запуска cmd
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;
}
}
Ответ 9
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);
}
}
}