Buenas a tod@s feliz inicio de año nuevo...
bien, tengo una duda estoy tratando de crear un aplicacion te tipo webserver/server
usando socket , serversocket, solamente por que quiero aprender y tambien quisiera saber si
este servidor puede interactuar con aplicaciones escritas en otros lenguajes (c++, c.. obvio que si)
quisiera entender por pasos y no soy nuevo en java pero para esta aplicacion mis conocimientos de socket
son limitados , quisiera entender, quisiera que me recomendaran algun libro y link donde pueda leer
acerca de este tema.
pero como quiera les quiero mostrar algo sencillo , que quizas todos los que saben de estetema en el foro saben.
package ConexionCliente;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class SocketCliente{
///BufferedOutputStream bout = null;
///BufferedInputStream bin = null;
ObjectOutputStream output = null;
ObjectInputStream input = null;
Socket sck = null;
boolean can = false;
public SocketCliente(){
try{
sck = new Socket("localhost", 4444);
}
catch(Exception e)
{
e.printStackTrace();
}
}
public SocketCliente(String host, int port){
try
{
sck = new Socket( host , port);
if(sck != null)
System.out.println("Se Conecto con "+sck.getInetAddress().getHostAddress() );
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println("SocketCliente");
}
public String receive(){
System.out.println("receive");
String ret= null;
if(sck.isClosed())
{
System.out.print("Socket is Close");
return ret;
}
try {
BufferedReader br = new BufferedReader(new InputStreamReader(sck.getInputStream()));
String t;
while((t = input.readLine()) != null){
ret += t;
System.out.println(t);
}
//br.close();
input.close();
} catch (IOException e) {
e.printStackTrace();
}
finally{
System.out.println("receive");
return ret;
}
}
public void Send(String str){
System.out.printf("%s\n", str);
try {
if(sck.isClosed())
{
System.out.print("Socket is Close");
return;
}
PrintWriter pw = new PrintWriter(sck.getOutputStream());
pw.print(str);
pw.flush();
//output = new ObjectOutputStream(sck.getOutputStream());
//output.writeBytes(str);
//output.flush();
//output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
System.out.println("Send");
}
}
public void Close(){
if(!sck.isClosed())
{
try {
sck.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
este codigo es de Main
public class Main {
public static void main(String[] args) {
//try{
//Socket s = new Socket(InetAddress.getByName("stackoverflow.com"), 80);
//PrintWriter pw = new PrintWriter(s.getOutputStream());
//pw.print("GET / HTTP/1.1\r\nHost: stackoverflow.com\r\n\r\n");
/// pw.print("Host: stackoverflow.com\r\n\r\n");
//pw.flush();
//BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//String t;
//while((t = br.readLine()) != null) System.out.println(t);
//br.close();
//}catch(Exception e){
// e.printStackTrace();
//}
String str;
str = "GET / HTTP/1.1\r\nHost: google.com\r\n\r\n";
/// SocketCliente sck = new SocketCliente("google.com", 80);
SocketCliente sck = new SocketCliente("localhost",4444);
sck.Send(str);
String res = sck.receive();
System.out.println(res);
sck.Close();
ahora el codigo del servidor
package Server;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
public class Server implements Runnable{
int puerto;
ServerSocket ssock;
Socket sock;
boolean isrun = true;
String server_id;
String response;
Server(int puerto, String sid){
this.puerto = puerto;
server_id = sid;
try{
ssock = new ServerSocket(puerto);
}catch(IOException e){
e.printStackTrace();
}
}
public void HandleRequest(){
System.out.println("manejando desde el Puerto "+ Integer.toString(puerto));
try{
sock = ssock.accept();
System.out.println("cliente Conectado desde la IP "+sock.getRemoteSocketAddress());
Reader in = new InputStreamReader(new BufferedInputStream(sock.getInputStream()));
StringBuilder request = new StringBuilder(2048);
while (true) {
int c = in.read();
if (c == '\r' || c == '\n' || c == -1) break;
request.append((char) c);
}
System.out.printf("%s", request.toString());
Writer out = new OutputStreamWriter(sock.getOutputStream());
Date now = new Date();
out.write(now.toString() +"\r\n");
out.flush();
sock.close();
isrun = false;
System.out.println("Cliente desconectado");
}catch(IOException e){
e.printStackTrace();
}
}
@Override
public void run() {
while(isrun){
System.out.println("Esperando conexion....");
HandleRequest();
}
}
}
Bueno cada vez que trato de interactuar el servirdor lee solo hasta \n \t el reader no me permite leer una linea completa se queda colgado, me gustaria que me ayudaran por favor post-data la informacion que me respoda no importa esta parte se puede obviar. gracias de antemano por los consejos..