Posilam me kody.
Strana klienta:
- vzdy vytvori novou instaci, MySocketClient(host, port)
- posle packet na server, funkce: writeObject(packet)
a ceka na prijem packetu ze serveru, funkce readObject()
- kdyz prijme data od serveru, tak je posle na USB, viz funkce :
sendPacket(sendPacket)
Strana serveru:
- za zacatku vytvori instanci serveru, MySocketServer(port, this)
- a pak vzdt ceka na accept, po acceptu se spusti vlakno pro prijem a
odeslani packetu
// cast Main
if (typeRemoteAccess == RemoteAccess.TYPE_CLIENT) {
String host = RemoteAccess.getHost();
int port = RemoteAccess.getPort();
m_mySocketClient = new MySocketClient(host, port);
m_mySocketClient.connect();
m_mySocketClient.writeObject(packet);
DCPPacket sendPacket = m_mySocketClient.readObject();
if (sendPacket != null) {
try {
sendPacket(sendPacket);
} catch (Exception e) {}
System.out.println("Od Server send : " + packet.m_address);
}
}
else if (typeRemoteAccess == RemoteAccess.TYPE_SERVER) {
if (mySocketServer == null) m_mySocketServer = new
MySocketServer(port, this);
m_mySocketServer.listenClient(packet);
}
// MySocketServer.java
public class MySocketServer {
private DCPServer m_dcpServer;
private ServerSocket m_serverSocket;
private Connect m_connect;
private Boolean m_acceptStatus = Boolean.FALSE;
public MySocketServer(int port, DCPServer dcpServer) {
m_dcpServer = dcpServer;
try {
m_serverSocket = new ServerSocket(port);
} catch (Exception e) {
//e.printStackTrace();
}
System.out.println("Server posloucha na portu: " + port);
}
public void listenClient(DCPPacket packet) {
try {
System.out.println("Ceka na pripojeni.");
Socket client = m_serverSocket.accept();
System.out.println("Akceptovane pripojeni z: " +
client.getInetAddress());
m_connect = new Connect(client, packet, m_dcpServer);
m_connect.start();
} catch(Exception e) {
close();
}
}
private void close() {
try {
m_serverSocket.close();
} catch(Exception ex) {
System.err.println("Chyba pri zavirani accept server: " +
ex.getMessage());
}
}
}
class Connect extends Thread {
private DCPServer m_dcpServer;
private DCPPacket m_packet;
private Socket m_client = null;
private ObjectInputStream m_objectIn = null;
private ObjectOutputStream m_objectOut = null;
private boolean m_receiveStatus = false;
public Connect(Socket clientSocket, DCPPacket packet, DCPServer
dcpServer) {
m_dcpServer = dcpServer;
m_client = clientSocket;
m_packet = packet;
try {
// otevreni I/O streamu
m_objectIn = new ObjectInputStream(m_client.getInputStream());
m_objectOut = new
ObjectOutputStream(m_client.getOutputStream());
} catch(Exception e) {
try {
m_client.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
return;
}
}
public void run() {
// poslani packetu klientovi
writePacket(m_packet);
// cteni packetu od klienta
readPacket();
// zavreni spojeni
close();
}
private void writePacket(DCPPacket packet) {
try {
// poslani objektu zpet klientovi
m_objectOut.writeObject(packet);
m_objectOut.flush();
System.out.println("Poslan packet klinetovi.");
} catch (Exception e) {
close();
System.err.println("Chyba pri zapisu packetu do klient!");
}
}
private void readPacket() {
try {
// cteni objektu
DCPPacket packet = (DCPPacket) m_objectIn.readObject();
System.out.println("Od client read: " + packet.m_address);
m_dcpServer.notifyPacket(packet);
} catch (Exception e) {
close();
System.err.println("Chyba pri cteni packetu z klienta!");
}
}
private void close() {
try {
// zavreni pripojeni
m_objectIn.close();
m_objectOut.close();
m_client.close();
} catch (Exception e) {
System.err.println("Chyba pri zavirani objektu na strane
serveru!");
}
}
}
// MySocketClient.java
public class MySocketClient {
private String m_host;
private int m_port;
private Socket m_socket = null;
private ObjectOutputStream m_out = null;
private ObjectInputStream m_in = null;
public MySocketClient(String host, int port) {
m_host = host;
m_port = port;
}
public void connect() {
try {
m_socket = new Socket(m_host, m_port);
m_out = new ObjectOutputStream(m_socket.getOutputStream());
m_in = new ObjectInputStream(m_socket.getInputStream());
System.err.println("Pripojeno k host: " + m_host);
} catch (UnknownHostException e) {
System.err.println("Neznamy host: " + m_host);
} catch (IOException e) {
System.err.println("Nemuzu se pripojit k: " + m_host);
}
}
public void writeObject(DCPPacket packet) {
try {
m_out.writeObject(packet);
m_out.flush();
System.out.println("Odeslan packet na server.");
} catch (IOException e) {
System.err.println("Chyba pri zapisu packetu na server!");
} catch (NullPointerException e) {}
}
public DCPPacket readObject() {
DCPPacket packet = null;
try {
packet = (DCPPacket) m_in.readObject();
System.out.println("Precten packet ze serveru.");
return packet;
} catch (IOException e) {
System.err.println("Chyba pri cteni packetu ze serveru!");
return null;
} catch (ClassNotFoundException e) {
System.err.println("Chyba trida nenalezena!");
return null;
} catch (NullPointerException e) {
return null;
}
}
public void close() {
try {
m_out.close();
m_in.close();
} catch (Exception e) {}
}
}
Martin Kuba napsal(a):
Martin Jedlička napsal(a):
Nene, potrebuju prenest data prectene na jednom PC z USB na jiny PC a
zpet.
Presneji receno: Na serveru (PC2) budu posilat packety klientovi
(PC1) pres TCP, klient posle packet na USB a odpoved z USB posle zpet
pres TCP serveru...
Proc RMI?
Pri pouziti socketu mam problem v tom, ze kdyz posle server packet
klientovi, tak server ocekava odpoved od klienta... pokud ale klient
neodpovi, tak server "vytuhne" na funkci accept.
Myslel jsem, ze problem s cekanim na accept na strane serveru obejdu
pouzitim RMI, navic RMI je trosku vyhodnejsi na implementaci.
Tak to nei, accept() je pro prijmuti spojeni na serverovem socketu,
a vrati jiny socket, ktery je ekvivalentni tomu klientskemu.
Tj. po navazani spojeni jsou si uz klient a server rovny,
lisi se jenom pred navazani spojeni tim, ze server ceka na znamem portu
a klient spojeni iniciuje.
Makub