2013-12-01 3 views
0

Я новичок в сетевой связи, и я пытаюсь создать клиент-серверное приложение.Соединение сокетов TCP

protected void init(){ 
    Server myServer = new Server(); 
    Client myClient = new Client(); 
} 

Это мой класс Клиент:

public class Client { 

public Client() { 
    init(); 
} 

private void init() { 
    Socket echoSocket = null; 
    DataOutputStream os = null; 
    DataInputStream is = null; 
    DataInputStream stdIn = new DataInputStream(System.in); 

    try { 
     echoSocket = new Socket("localhost", 1234); 
     os = new DataOutputStream(echoSocket.getOutputStream()); 
     is = new DataInputStream(echoSocket.getInputStream()); 

     os.writeInt(stdIn.readInt()); 

     echoSocket.getOutputStream().close(); 
     echoSocket.getInputStream().close(); 
     echoSocket.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

И это сервер:

public class Server { 

public Server() { 
    init(); 
} 

private void init() { 
    try { 
     boolean run = true; 
     ServerSocket ss = new ServerSocket(1234); 
     Socket s = ss.accept(); 
     DataInputStream dis = new DataInputStream(s.getInputStream()); 
     System.out.println(dis.readInt()); 
     s.getInputStream().close(); 
     s.getOutputStream().close(); 
     s.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

} 

Прежде всего: Могу ли я инициализировать клиент и сервер просто, как я сделал? new Server() и new Client()?

Вопрос 2: Важно ли то, что я инициализирую сначала? клиент или сервер?

Вопрос 3: Когда я скомпилирую этот код с первым инициализированным клиентом, я становлюсь Connection refused: connect. Я знаю, это означает, что на порту, к которому вы пытаетесь подключиться, нет прослушивающего сокета. Вот почему сервер должен идти первым, я думаю. Это так? могу ли я исправить это с помощью setSoTimeout и как?

Вопрос 4: Когда я скомпилирую его с сервером, а затем с клиентом, вывод ничего. И я думаю, что это не имеет ничего общего с клиентом, потому что, если я пытаюсь напечатать «1», например, он тоже не работает. Я думаю, что он просто ждет клиента и ничего не делает после этого. Как я могу это исправить? может быть, setSoTimeout тоже идет?

ответ

2

У вас не может быть как клиент, так и сервер в одном потоке.

Как вы уже заметили, сервер принимает соединение и пытается что-то прочитать. Он не знает, что клиент работает в одном потоке.

Либо создайте многопоточное приложение, где клиент и сервер имеют собственный поток. Или создайте две программы, которые работают независимо друг от друга. Последний будет также «нормальным случаем».

1

Сделайте два разных проекта, первый запуск сервера, чем клиент. Сервер будет писать на консоли «Сервер запущен», чем запустить клиент, он спросит ваше имя, введите свое имя, нажмите ОК. Ваше имя будет отправлено на сервер, и сервер ответит вам привет.

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

import java.net.*; 
import java.io.*; 
import javax.swing.*; 
public class Server { 
    public static void main(String[] args) { 
     try{ 
      ServerSocket ss= new ServerSocket(2224); 
      System.out.println("Serever started"); 
      while(true) 
      { 
       Socket s=ss.accept(); 
       InputStream is=s.getInputStream(); 
       InputStreamReader isr=new InputStreamReader(is); 
       BufferedReader br=new BufferedReader(isr); 
       OutputStream os=s.getOutputStream(); 
       PrintWriter pw=new PrintWriter(os); 
       String name=br.readLine(); 
       String message="Hello "+name+"from server"; 
       pw.println(message); 
       pw.flush(); 
      } 
     } 
     catch(Exception exp) 
     { 
     System.out.println("Excepttion occured"); 
     } 
    } 
} 

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

import java.net.*; 
import java.io.*; 
import java.util.Scanner; 
import javax.swing.*; 
public class Client { 
    public static void main(String[] args) throws IOException { 
     Socket s=new Socket("localhost",2224); 
     InputStream is=s.getInputStream(); 
     InputStreamReader isr=new InputStreamReader(is); 
     BufferedReader br=new BufferedReader(isr); 
     OutputStream os=s.getOutputStream(); 
     PrintWriter pw=new PrintWriter(os,true); 
     String message = JOptionPane.showInputDialog("Give your name"); 
     pw.println(message); 
     pw.flush(); 
     String servermessage = br.readLine(); 
     JOptionPane.showMessageDialog(null, servermessage); 
     s.close(); 
    } 
} 
Смежные вопросы