网络编程之理解2


/*
 时间:2015年3月14日18:12:02
 测试的仍然是ServerSocket和Socket,不过本次着重理解一下关于流的知识。
 DataInputStream的构造方法如下:
  public DataInputStream(InputStream in)
  使用指定的底层 InputStream 创建一个 DataInputStream。
  是一个处理流。
  public final boolean readBoolean()
                          throws IOException
    public final String readUTF()
                     throws IOException、
    public final int read(byte[] b)
               throws IOException从包含的输入流中读取一定数量的字节,
               并将它们存储到缓冲区数组 b 中。
               以整数形式返回实际读取的字节数。
               在输入数据可用、检测到文件末尾 (end of file) 或抛出异常之前,
               此方法将一直阻塞。
   public final int read(byte[] b,int off,int len)throws IOException;
 从包含的输入流中将最多 len 个字节读入一个 byte 数组中。
 尽量读取 len 个字节,但读取的字节数可能少于 len 个,也可能为零。
 以整数形式返回实际读取的字节数。
 在输入数据可用、检测到文件末尾或抛出异常之前,此方法将阻塞。
 
 DataOutputStream类中均有相应的构造方法和普通方法。
 由于在这两个类中有基类中没有的方法,也就是具有新增方法,
 因此在创建该类型的对象的时候如果想要使用相应的写入或者读出基本数据类型的时候,
 必须声明为DataInputStram和DataOutputStream类型。而不能使用多态的特性声明
 为InputStream和OutputStream类型。

*/
import java.net.*;
import java.io.*;

public class TestSockServer {
 public static void main(String[] args) {
  InputStream in = null;
  OutputStream os = null;
  DataInputStream dis = null;
  DataOutputStream dos = null;
  
  String str = null;
  char ch;
  int i;
  double d;
  boolean b;
  
  try {
   ServerSocket ss = new ServerSocket(6666);
   Socket server = ss.accept();
   
   in = server.getInputStream();
   dis = new DataInputStream(in);
   os = server.getOutputStream();
   dos = new DataOutputStream(os);
   
   if ((str = dis.readUTF()) != null) {
    System.out.println(str);
    System.out.println("from " + server.getInetAddress());
    System.out.println("LocalPort " + server.getLocalPort());
    System.out.println("port " + server.getPort());
   }
   
   ch = dis.readChar();
   b = dis.readBoolean();
   i = dis.readInt();
   d = dis.readDouble();
   
   System.out.println("Server ");
   System.out.println("=======================");
   System.out.println("ch = " + ch);
   System.out.println("b = " + b);
   System.out.println("i = " + i);
   System.out.println("d = " + d);
   System.out.println("=======================");
   
   dos.writeUTF("不不不,client是帅哥!");
   dos.writeChar('A');
   dos.writeBoolean(true);
   dos.writeInt(20);
   dos.writeDouble(2.43);
   
   dos.close();
   os.close();
   dis.close();
   in.close();
   server.close();
  } catch (IOException e) {
   System.out.println("IO读写错误");
  }
  
 }
}
/*

D:\java\socket>java TestSockServer
server是帅哥!
from /127.0.0.1
port 33537
Server
=======================
ch = B
b = true
i = 20
d = 2.43
=======================

D:\java\socket>java TestSockServer.java
错误: 找不到或无法加载主类 TestSockServer.java

D:\java\socket>javac TestSockServer.java

D:\java\socket>java TestSockServer
server是帅哥!
from /127.0.0.1
LocalPort 6666
port 33749
Server
=======================
ch = B
b = true
i = 20
d = 2.43
=======================

*/




/*
 时间:2015年3月14日18:13:00
 测试的仍然是ServerSocket和Socket,不过本次着重理解一下关于流的知识
 在客户端,我们可以看到第一次的运行是有问题的,
 (在本次运行中,该if语句若被删掉的执行结果为第一次)
 这是因为DataInputStream和DataOutputStream这两个流在进行输出传输的时候,
 严格按照字节进行的。也就是说,你用DataOutputStream往流中输入基本数据类型的数据时,
 必须严格按照相应的次序使用DataInputStream读取相应的数据类型,一点都不能错。
 但是由于第一次运行的时候没有if语句块,所以在由服务器端写到该套接字流中
 “不不不,Client才是帅哥!”,并没有在客户端中读取,这样的话,在其后的读取中,
 总是按照相应的数据类型读取一定的字节,并处理本想成为的数据类型,这当然不是
 我们的意图。
 
*/
import java.net.*;
import java.io.*;

public class TestSockClient {
 public static void main(String[] args) {
  InputStream in = null;
  OutputStream os = null;
  DataInputStream dis = null;
  DataOutputStream dos = null;
  
  String str = null;
  char ch;
  int i;
  double d;
  boolean b;
  
  try {
   Socket client = new Socket("127.0.0.1", 6666);
   in = client.getInputStream();
   dis = new DataInputStream(in);
   os = client.getOutputStream();
   dos = new DataOutputStream(os);
   
   dos.writeUTF("server是帅哥!");
   dos.writeChar('B');
   dos.writeBoolean(true);
   dos.writeInt(20);
   dos.writeDouble(2.43);
   
   //该if语句若被删掉
    if ((str = dis.readUTF()) != null) {
    System.out.println(str);
    System.out.println("from " + client.getInetAddress());
    System.out.println("LocalPort " + client.getLocalPort());
    System.out.println("port " + client.getPort());
   }
   
   
   ch = dis.readChar();
   b = dis.readBoolean();
   i = dis.readInt();
   d = dis.readDouble();
   
   System.out.println("Client ");
   System.out.println("=======================");
   System.out.println("ch = " + ch);
   System.out.println("b = " + b);
   System.out.println("i = " + i);
   System.out.println("d = " + d);
   System.out.println("=======================");
   
   dos.close();
   os.close();
   dis.close();
   in.close();
   client.close();
  }catch (UnknownHostException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}
/*

D:\java\socket>javac TestSockClient.java

D:\java\socket>java TestSockClient
Client
=======================
ch =
b = true
i = -1198660424
d = -9.710966054458669E-242
=======================

D:\java\socket>javac TestSockClient.java
TestSockClient.java:34: 错误: 找不到符号
                                System.out.prinltn("LocalPort " + client.getLocalPort());
                                          ^
  符号:   方法 prinltn(String)
  位置: 类型为PrintStream的变量 out
1 个错误

D:\java\socket>javac TestSockClient.java

D:\java\socket>java TestSockClient
不不不,client是帅哥!
from /127.0.0.1
LocalPort 33749
port 6666
Client
=======================
ch = A
b = true
i = 20
d = 2.43
=======================
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值