vlambda博客
学习文章列表

C/S架构下ServerSocket及Socket应用

羽生结弦冬奥挑战4A两次跌倒。我们都以为这是一个勇者的挑战失败。最新消息国际华联认定羽生结弦4A完成。超越自我,峰回路转,终将不负超越!



Java IO流之DataInputStreamDataOutputStream分析


1.DataInputStream

1)构造方法

Public DataInputStream(InputStream in){ super(in);}

2)内部方法

read(byte b[])---从数据输入流读取数据存储到字节数组b.

read(byte b[],int off,in len)---从数据输入流中读取数据存储到数组b里面,位置从off开始,长度为len个字节.

readFully(byte b[])---从数据输入流中循环读取b.length个字节到数组b.

readFully(byte b[],int off,in len )---从数据输入流中循环读取len个字节到字节数组b.boff位置开始

skipBytes(int b)---跳过n个字节.

readBoolean()---从数据输入流读取布尔类型的值.

readByte()---从数据输入流中读取一个字节.

readUnsignedByte()---从数据输入流中读取一个无符号的字节,返回值转换成int类型.

readShort()---从数据输入流读取一个short类型数据.

 

readUnsignedShort()---从数据输入流读取一个无符号的short类型数据.

readChar()---从数据输入流中读取一个字符数据

readInt()---从数据输入流中读取一个int类型数据.

readLong()---从数据输入流中读取一个long类型的数据.

readFloat()---从数据输入流中读取一个float类型的数据.

readDouble()---从数据输入流中读取一个double类型的数据.

readUTF()---从数据输入流中读取用UTF-8格式编码的UniCode字符格

2. DataOutputStream

(1)构造方法

Public DataOutputStream(OutputStream Out){ super(out);}

(2)内部方法

intCount(int value)---数据输出流增加的字节数.

write(int b)---int类型的b写到数据输出流中.

write(byte b[],int off, int len)---将字节数组boff位置开始,len个长度写到数据输出流中.

flush()---刷新数据输出流.

writeBoolean()---将布尔类型的数据写到数据输出流中,底层是转化成一个字节写到基础输出流中.

writeByte(int v)---将一个字节写到数据输出流中(实际是基础输出流).

writeShort(int v)---将一个short类型的数据写到数据输出流中,底层将v转换2个字节写到基础输出流中.

writeChar(int v)---将一个charl类型的数据写到数据输出流中,底层是将v转换成2个字节写到基础输出流中.

writeInt(int v)---将一个int类型的数据写到数据输出流中,底层将4个字节写到基础输出流中.

writeLong(long v)---将一个long类型的数据写到数据输出流中,底层将8个字节写到基础输出流中.

writeFloat(flloat v)---将一个float类型的数据写到数据输出流中,底层会将float转换成int类型,写到基础输出流中.

writeDouble(double v)---将一个double类型的数据写到数据输出流中,底层会将double转换成long类型,写到基础输出流中.

writeBytes(String s)---将字符串按照字节顺序写到基础输出流中.

writeChars(String s)---将字符串按照字符顺序写到基础输出流中.

writeUTF(String str)---以机器无关的方式使用utf-8编码方式将字符串写到基础输出流中.

size()---写到数据输出流中的字节数.

 

C/S架构下ServerSocketSocket应用

 

C/S开发在服务器端建立一个ServerSocket开发一个端口,对客户端进行服务,在客户端要建立一个Socket通过IP和服务器端开发的端口访问服务器端。

 

先开发服务器端程序,再开发客户端程序。

 

1. 运行在服务器端的程序

(1)

 

Import java.io.*;

Import java.net.*;

Import java.util.*;

Public class Li3

{

     Public static void main(String[] args)

     {

          Int count =0; //声明用来计数的int局部变量

          Try

          {

             //创建绑定到9876端口的ServerSocket对象

             ServerSocket server=new ServerSocket(9876);

             System.out.println(服务器对9876端口正在进行监听”);

           //服务器循环接收客户端的请求,若有连接请求返回对应的Socket对象

           While(true)

           {

              //接收客户端的连接请求,若有连接请求则返回对应的Socket对象

              Socket sc=server.accept();

              //获取当前连接的输入流,并使用处理流进行封装

            DataInputStream din =new DataInputStream(sc.getInput Stream());

             //获取当前连接的输出流,并使用处理流进行封装

            DataOutputStream dout =new DataOutputStream(sc.getOutput Stream());

             //打印客户端信息

           System.out.println(这是第+++count+个客户访问);

           System.out.println(本地端口号:+sc.getLocalPort());

           System.out.println(客户端信息:+din.readUTF());

           //向客户端发送回应信息

        Dout.writeUTF(服务器的时间为:+(new Date())+.);

        //关闭流

        Din.close();

        Dout.close();

       // 关闭此Socket连接

       Sc.close();

      }

}

Catch (Exception e)

{

      e.printStackTrace();

}

}

}

(2) 运行结果

服务器对9876端口正在进行监听

 

使用ServerSocket类创建了一个对象来对9876端口进行监听。当有客户端程序来访问该程序时,就执行while循环,从而让服务器获取客户端的信息,并从服务器端向客户端发送当前时间信息。

 

注释:

catch(Exception e){        e.printStackTrace() ;}   try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace() ;printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。

 

 

2.运行在客户端的程序

 

开发完服务器端程序后,就需要继续来开发运行在客户端的程序。在客户端的程序需要使用Socket类来进行操作。

(1)

 

 

Import java.io.*;

Import java.net.*;

Public class Li4

{

     Public static void main(String[] args)

     {

          Try

          {

             //创建连接到服务器的对象

             Server sc=new Socket(192.168.1.119,9876);

              //获取当前连接的输入流,并使用处理流进行封装

            DataInputStream din =new DataInputStream(sc.getInput Stream());

             //获取当前连接的输出流,并使用处理流进行封装

           DataOutputStream dout =new DataOutputStream(sc.getOutput Stream());

           //向服务器端发送信息

        Dout.writeUTF(HELLO.);

         //读取服务器的返回消息并打印

       System.out.println(din.readUTF());

        //关闭流

        Din.close();

        Dout.close();

       // 关闭此Socket连接

       Sc.close();

      }

}

Catch (Exception e)

{

      e.printStackTrace();

}

}

}

 

(2)运行结果

 

服务器的时间为:Sun May 04 09:32:29 CST 2008.

运行该程序后,服务器端的运行结果也会发生变化

 

这是第1个客户访问

本地端口号:9876

客户端信息:HELLO.