要做成这样的:
客户端访问服务器ip和port,服务器马上发送welcome消息,然后客户端根据welcome消息判断是否是想要连接的服务器和端口,
如果是则开始发送数据,数据包括开始和结束的校验。服务器端发送welcome消息后开始接收数据,直到结束。蛮简单的事tmd我怎么就搞不定。
client:
package com.ces.mytest.socket;
import java.net.*;import java.io.*;
public class clientthread extends thread { private string ipstr = ""; private int port; public clientthread(string ipstr, int port) { this.ipstr = ipstr; this.port = port; }
public void run() { try { socket client = new socket(ipstr, port); bufferedreader read = new bufferedreader(new inputstreamreader(client.getinputstream())); bufferedwriter write = new bufferedwriter(new outputstreamwriter(client.getoutputstream()));
if ("欢迎".equals(read.readline())) { system.out.println("校验正确");
write.write("开始"); write.newline(); write.write("数据"); write.newline(); write.write("结束"); write.newline(); write.flush();
system.out.println("发送完毕"); }
write.close(); read.close(); client.close(); } catch (unknownhostexception ex) { ex.printstacktrace(); } catch (ioexception ex) { ex.printstacktrace(); } }
public static void main(string[] args) { thread client = new clientthread("127.0.0.1",10020); client.start(); }
}
server:
package com.ces.mytest.socket;
import java.net.*;import java.io.*;
public class serverthread extends thread { private int port; public serverthread(int port) { this.port = port; }
private boolean stop = false;
public void run() { try { serversocket server = new serversocket(port); while (!stop) { socket client = server.accept(); bufferedreader read = new bufferedreader(new inputstreamreader(client.getinputstream())); bufferedwriter write = new bufferedwriter(new outputstreamwriter(client.getoutputstream())); system.out.println("发送欢迎信息"); write.write("欢迎"); write.flush();
// string linestr = read.readline();// if ("开始".equals(linestr)) {// system.out.println("开始接受数据!");//// while (true) {// linestr = read.readline();// if ("结束".equals(linestr)) {// break;// } else {// system.out.println("数据是" + linestr);// }// }// }
write.close(); read.close(); client.close(); }
} catch (ioexception ex) { ex.printstacktrace(); } }
public static void main(string[] args) { thread server = new serverthread(10020); server.start(); }
public boolean isstop() { return stop; }
public void setstop(boolean stop) { this.stop = stop; }}
只要我将serverthread类的string linestr = read.readline();的注释去掉,程序肯定出问题,什么问题呢?分析发现serverthread的output流必须等write.close()执行完才发送,而read.readline()程序就会停在那里,所谓的block程序,可参考上明明说write.flush()即可发送啊,搞不懂搞不懂,这样我的握手协议怎么做啊??
