看过一句话,程序员的能力很大程度上取决于博客,想着,是该写写,文采不好,请见谅。
从Java网络编程写起吧!
从ServerDemo说起:
ServerDemo server = new ServerDemo();
server.start();
ServerDemo类的start()主要是服务器的监听。
public void start() throws IOException{
//在服务器上绑定8000服务端口号, 不能重复绑定
ServerSocket ss = new ServerSocket(8000);
while(true){
//ss.accept() 方法是IO Block方法, 会挂起当前线程
//等到客户连接(IO 过程)的完成, 一旦有客户连接进来
//就返回 Socket 实例s 代表客户端
System.out.println("等待客户的连接...");
Socket s = ss.accept();
System.out.println("客户连接成功:"+s.getInetAddress());
new Service(s).start();//派发服务线程,处理客户的服务
}
}
Service是对业务的处理,进行对客户端的请求返回结果。
class Service extends Thread{
Socket s;
public Service(Socket s) {
this.s = s;
}
public void run() {
try{
//in 代表客户端送来的信息
InputStream in = s.getInputStream();
//out代表向客户端传送到信息
OutputStream out = s.getOutputStream();
out.write("你吃点啥?\n".getBytes());
out.flush();
Scanner s = new Scanner(in);
while(true){
String str = s.nextLine().trim();
if(str.equals("粗面")){
out.write("没有!\n".getBytes());
out.flush();
}else if(str.equals("包子")){
out.write("有!给你\n".getBytes());
out.flush();
break;
}else{
out.write("你说啥?\n".getBytes());
out.flush();
}
}
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
到了客户端,形式上和服务端一样,在main方法中有open()发起对服务器的连接
public void open() throws IOException{
//new Socket()会发起向 localhost:8000 的连接
//"localhost" 是服务器的 域名/IP, localhost 在IP
//协议中是当前计算机自身的域名, 会映射到 127.0.0.1
Socket s = new Socket("localhost", 8000);
//如果连接成功: 就会创建Socket实例s, 不成功会抛出异常
//in代表服务器到客户端的流
InputStream in = s.getInputStream();
//代表客户端到服务器的流
OutputStream out = s.getOutputStream();
//Reader 线程负责将读取控制台的信息, 写到服务器端(out)
new Reader(out).start();
//Writer 赋值读取服务器送来(in)的信息, 写到客户端控制台
new Writer(in).start();
}
其中Reader类是代表客户端到服务器的流,即对服务器的请求,反之,Write就是接受服务器的响应
class Reader extends Thread{
OutputStream out;
public Reader(OutputStream out) {
this.out = out; setDaemon(true);
}
public void run(){
Scanner s = new Scanner(System.in);
try{
while(true){
String str = s.nextLine();//读取控制台
out.write(str.getBytes());//发送到服务器
out.write('\n');
out.flush();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
//Writer 赋值读取服务器送来(in)的信息, 写到客户端控制台
class Writer extends Thread{
InputStream in;
public Writer(InputStream in) {
this.in = in;
}
public void run() {
try{
int b;
while((b = in.read())!=-1){
System.out.write(b);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
java编程就是线程,IO流技术的结合,这算是一个学习Java网络的很简单的例子,望大家静下心来好好看看,同时也从博客中,我的心也静下来。