现在的情况是:win2K(SP2,含javaVM),装过web gain,运行server端正常,然后本机运行客户端报错如下:Exception in thread "main" java.util.zip.ZipException: 系统找不到指定的文件。 at java.util.zip.ZipFile.open(Native Method) at java.util.zip.ZipFile.<init>(ZipFile.java:110) at java.util.jar.JarFile.<init>(JarFile.java:115) at java.util.jar.JarFile.<init>(JarFile.java:57)我是个新手,大家见笑了:) 请问这是怎么回事?
你把你这个reader,writer是如何构造的代码贴出来,因为我觉得你现在的代码有点奇怪。从writer 往server写一个 "test",这可不是任何HTTP协议支持的东西,当然会返回 Not Implemented了。HTTP协议支持的有GET,POST,HEAD,PUT等等,好好看看RFC吧。
FAINT WUWUWUWUWA~~~~~~~~~~~~~~~~~~~~```package cynthia;import java.io.*; import java.net.*;public class Client { public InputStream in; public OutputStream out; private Socket client; public Client (String host,int port){ try{ client = new Socket(host,port); System.out.println("Client socket: "+client); in = client.getInputStream(); out = client.getOutputStream();
}catch(IOException e){ System.out.println("IOExc:"+e); } } }package cynthia;import java.io.*; import java.net.*;public class scanner{ public static void main(String [] args){ String welcome,reponse; Client client; BufferedReader reader; PrintWriter writer; client = new Client("xxxx",80); try{ reader = new BufferedReader(new InputStreamReader(client.in)); writer = new PrintWriter (new OutputStreamWriter(client.out),true); welcome = reader.readLine(); writer.println("hello"); welcome = reader.readLine(); if (welcome.startsWith("me") ){ System.out.println("Server says: '"+welcome+"'"); System.out.println("this is"); writer.println("quit"); } writer.println("next i will quit"); welcome = reader.readLine(); if (welcome.startsWith("me")){ System.out.println("Server says: '"+welcome+"'"); System.out.println("this is"); } System.out.println("Hello"); writer.println("hello");
System.out.println("quit"); //writer.println("quit"); //reponse = }catch (IOException e){ System.out.println("IOException get at the scanner"); System.out.println(e); } try{ Thread.sleep(2000); }catch (InterruptedException ignored){ System.out.println("get a sleep exception"); } } }
现在LAN中用的proxy并不只是简单的tunnel,所以它会检查所有的http request和http response。 也就是说那个501 status不是你在internet上的server发回的,而是proxy...解决办法,简单的:request 变成 GET /xxxx HTTP/1.1 其中/xxxx可以根据你request的情况自己定义,比如/data表示索取数据,/user表示索取用户信息。Response 先读完整个request再根据/xxx的内容发送response.格式为HTTP/1.1 200 OK content-type: text/plain (这里要根据你送回数据的类型选MIME类型) content-length: xxx (response 内容的长度)xxxxxxxx (具体返回的内容)千万注意所有http request和http reponse的header必须用iso8859_1编码,切不能直接传String,需用char。另外注意所有的空格,换行用"\r\n",在response的content-length后需多加一个换行(如上所示)再给两个小列子/** * On the client side sending request, we should * call readReponse immediate after this method was called */ private sendRequest(String target, OutputStream out) { //故意写长一点可以看清request中的细节 printHead("GET"); printHead(" "); printHead(target); printHead(" "); printHead("HTTP/1.1"); printHead("\r\n"); endHeaderBuffer(out); // Write buffer to output stream. }/** * On the Server side, sending response, we * should call processRequest() before this * method is called. */ private void sendResponse(OutputStream out) { // clear header buffer before this is called. printHead("HTTP/1.1 200 OK"); printHead("\r\n"); printHead("Content-Type: text/plain"); printHead("\r\n"); printHead("Content-Length: "+getContentLen()); printHead("\r\n"); printHead("\r\n"); endHeaderBuffer(out);// write out all the headers in the buffer doRealOutput(out);//write the content of your response }
/** * Print a head to buffer.... */ private void printHead( String s ) { if (s==null) s="null"; int len = s.length(); for (int i = 0; i < len; i++) { char c = s.charAt (i);
if ((c & 0xff00) != 0) // high order byte must be zero
System.out.println("Header character is not iso8859_1, not supported yet: " + c ) ;
但是放到INTERNET上以后,就不行了。我让SERVER和CLIENT是在一台机器上运行的。CLIENT 里头的SERVER端的地址我试过SERVER在INTERNET上的真实地址,还有127。0。0。1。但是都不行,报同一个找不到路由的错误。
具体的一些例子,在论坛以前的帖子中都提到过,你可以搜索一下。
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:110)
at java.util.jar.JarFile.<init>(JarFile.java:115)
at java.util.jar.JarFile.<init>(JarFile.java:57)我是个新手,大家见笑了:) 请问这是怎么回事?
new BufferedReader reader;
PrintWriter writer;
....................
welcome = reader.readLine();
System.out.println(welcome);
writer.println("hello");
这个时候,运行到welcome = reader.readLine的时候,需要等待很长时间,welcome得到的返回值是一个空值.假如我加一句:
writer.println("test");
welcome = reader.readLine();
System.out.println(welcome);
writer.println("hello");
welcome = reader.readLine();
welcome = reader.readLine这句就会很快跳过,welcome打印出来是:HTTP/1.1 501 Not Implemented.
WUWUWUWUWA~~~~~~~~~~~~~~~~~~~~```package cynthia;import java.io.*;
import java.net.*;public class Client {
public InputStream in;
public OutputStream out;
private Socket client;
public Client (String host,int port){
try{
client = new Socket(host,port);
System.out.println("Client socket: "+client);
in = client.getInputStream();
out = client.getOutputStream();
}catch(IOException e){
System.out.println("IOExc:"+e);
}
}
}package cynthia;import java.io.*;
import java.net.*;public class scanner{
public static void main(String [] args){
String welcome,reponse;
Client client;
BufferedReader reader;
PrintWriter writer;
client = new Client("xxxx",80);
try{
reader = new BufferedReader(new InputStreamReader(client.in));
writer = new PrintWriter (new OutputStreamWriter(client.out),true);
welcome = reader.readLine();
writer.println("hello");
welcome = reader.readLine();
if (welcome.startsWith("me") ){
System.out.println("Server says: '"+welcome+"'");
System.out.println("this is");
writer.println("quit");
}
writer.println("next i will quit");
welcome = reader.readLine();
if (welcome.startsWith("me")){
System.out.println("Server says: '"+welcome+"'");
System.out.println("this is");
}
System.out.println("Hello");
writer.println("hello");
System.out.println("quit");
//writer.println("quit");
//reponse =
}catch (IOException e){
System.out.println("IOException get at the scanner");
System.out.println(e);
}
try{
Thread.sleep(2000);
}catch (InterruptedException ignored){
System.out.println("get a sleep exception");
}
}
}
try{
reader = new BufferedReader(new InputStreamReader(client.in));
writer = new PrintWriter (new OutputStreamWriter(client.out),true); welcome = reader.readLine(); // 想收到一个response,可是没有先给一个request!!!只会有一个结果,超时
writer.println("hello"); // 这倒算是一个request, 可是不符合协议规定的格式把其它什么乱七八糟的东西都去掉,试试这两句吧:
writer.println("GET /index.htm HTTP/1.0"); // 这才是标准的HTTP的GET格式,可以把index.htm 改成任何该server上存在的文件名称,也可以带目录名如 /cgi-bin/welcome.pl
welcome = reader.readLine();
从你说的返回HTTP/1.1 501 Not Implemented,可以看出,是HTTPD之类的Web Server绑定到了这个端口上了。
OICQ可以用80作代理吗?是吗?那我在公司也可以用了。:)
原理很简单:用一个不是httpd这样的服务程序来监听这个端口,只起一个转发数据的功能就行。这是一个专用的服务程序,你也可以做一个。但是,你程序中想访问的机器如果是外部的,就不是你能控制的了。
content-type: text/plain (这里要根据你送回数据的类型选MIME类型)
content-length: xxx (response 内容的长度)xxxxxxxx (具体返回的内容)千万注意所有http request和http reponse的header必须用iso8859_1编码,切不能直接传String,需用char。另外注意所有的空格,换行用"\r\n",在response的content-length后需多加一个换行(如上所示)再给两个小列子/**
* On the client side sending request, we should
* call readReponse immediate after this method was called
*/
private sendRequest(String target, OutputStream out)
{
//故意写长一点可以看清request中的细节
printHead("GET");
printHead(" ");
printHead(target);
printHead(" ");
printHead("HTTP/1.1");
printHead("\r\n");
endHeaderBuffer(out); // Write buffer to output stream.
}/**
* On the Server side, sending response, we
* should call processRequest() before this
* method is called.
*/
private void sendResponse(OutputStream out)
{
// clear header buffer before this is called. printHead("HTTP/1.1 200 OK");
printHead("\r\n");
printHead("Content-Type: text/plain");
printHead("\r\n");
printHead("Content-Length: "+getContentLen());
printHead("\r\n");
printHead("\r\n"); endHeaderBuffer(out);// write out all the headers in the buffer
doRealOutput(out);//write the content of your response
}
/**
* Print a head to buffer....
*/
private void printHead( String s )
{
if (s==null)
s="null"; int len = s.length();
for (int i = 0; i < len; i++)
{
char c = s.charAt (i);
if ((c & 0xff00) != 0)
// high order byte must be zero
System.out.println("Header character is not iso8859_1, not supported yet: " + c ) ;
if( bufferCount >= buffer.length )
{
byte bufferNew[]=new byte[ buffer.length * 2 ];
System.arraycopy( buffer,0, bufferNew, 0, buffer.length );
buffer=bufferNew;
}
buffer[bufferCount] = (byte)c;
bufferCount++;
}
}