C/S架构下ServerSocket及Socket应用
羽生结弦冬奥挑战4A两次跌倒。我们都以为这是一个勇者的挑战失败。最新消息国际华联认定羽生结弦4A完成。超越自我,峰回路转,终将不负超越!
Java IO流之DataInputStream和DataOutputStream分析
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中.从b的off位置开始
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)---将字节数组b中off位置开始,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架构下ServerSocket及Socket应用
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.