java网络编程

来源:互联网 发布:游族网络 大皇帝 手游 编辑:程序博客网 时间:2024/06/05 04:18

一、TCP/IP模型



二、IP地址

2.1)定义:互联网为每台电脑提供了一个编号,以便其他计算机能找到它并与其通信,这个编号就称作IP地址。是逻辑地址

         物理地址是MAC地址


2.2)主要使用的地址:

IPV4

    IP地址使用32(25)位二进制表示,通常表示成4组,每组8位形式。我们看到的IP地址多为点分十进制形式,如:127.0.0.1

IPV6

    IP地址使用128(27)位二进制表示,值得一提的是提高了安全性。身份认证和隐私权是IPV6的关键特性


2.3)IP地址的封装(这些都是静态方法


   代码实例:

获取新浪的IP地址

     InetAddress address =

     InetAddress.getByName(“www.sina.com.cn”);

获取新浪的IP地址列表

     InetAddress address =

     InetAddress.getAllByName(“www.sina.com.cn”);

获取本地的IP地址

     InetAddress address = InetAddress.getLocalHost();

获取InetAddress对象后,可以使用其定义的方法

     String hostAddress = address.getHostAddress();

     String hostName = address.getHostName();


三、流

3.1)定义:通过一定的传播路径从源传递到目的地的字节序列

3.2)输出流:从目的地写入的二进制序列。。write,一般是从缓冲区或数组写入到输出流

3.2.1)java输出流的基类是OutputStream,是个抽象类,方法如下:

public abstract void write(int b) throws IOException; //将指定字节写入输出流,只写入传入参数的低8位

public void write(byte[] b) throws IOException; //将byte数组中所有字节写入输出流

public void write(byte[] b, int off, int len) throws IOException; //off为起始位置,len为字节长度

public void flush() throws IOException; //将输出流缓存的所有字节写向它们预期的目标

public void close() throws IOException; //关闭输出流

3.2.1)加强版1.0,基类Writer,是个抽象类

public void write(int c) throws IOException;//将单个字符写入输出流

public void write(char[] cbuf) throws IOException;//向输出流中写入字符数组

public void write(char[] cbuf, int off, int len) throws IOException;

public void write(String str) throws IOException;//写入字符串

public void write(String str, int off, int len) throws IOException;

3.2.2)加强版2.0,PrintWriter,是Writer的子类

最常用的是print()和println()方法,重载了很多次

3.3)输入流:从数据源读取的二进制序列。。read,一般是从输入流读取到缓冲区或数组

3.3.1)java输入流的基类是InputStream,是个抽象类

public abstract int read() throws IOException; //从输入流读取数据的下一个字节,返回0~255的int字节值,没有则返回-1

public int read(byte[] b) throws IOException; //从输入流读取一定数量的字节,将其存储在b数组中,返回实际读取的字节数

public int read(byte[] b, int off, int len) throws IOException;

public long skip(long n) throws IOException; //跳过输入流的n个字节

public void close() throws IOException; //关闭输入流

3.3.2)加强版1.0,基类Reader,是个抽象类

public int read() throws IOException;//读取单个字符

public intread(char[] b) throws IOException; 

public abstract int read(char[] b, int off, int len) throws IOException;

public int read(CharBuffer targert) throws IOException; //读入到字符缓冲区

3.3.3)加强版2.0,InputStreamReader,是Reader的子类,是字节流通向字符流的桥梁,读取输入流中的字符,并将其解码为字符。。。通常为了提高效率,用BufferedReader封装一次

3.3.4)加强版3.0,BufferedReader,从字符输入流中读取文本,缓冲各个字符

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));


四、网络协议

4.1)定义:进行网络中的数据交换而建立的规则、标准或约定

4.2)网络协议的区别


五、套接字

5.1)定义:支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是实现网络上的两个程序之间的连接和通信。而连接的两端都分别有一个套接字


5.2)TCP/IP协议中通常包含三种套接字:

流套接字(ServerSocket(服务器端)、Socket(客户端))

     用于提供面向连接、可靠的数据传输服务。

数据报套接字(DatagramSocket及其子类MulticastSocket)

     提供一种无连接的服务。

原生套接字(SOCK_RAW)

     如果要访问其他协议发送数据必须使用原始套接字。


5.3)TCP编程

5.3.1)原理:


5.3.2)例子(一对一通信):

public class Client {//客户端public static void main(String[] args) throws Exception{Socket socket = new Socket("127.0.0.1",888);InputStreamReader reader = new InputStreamReader(socket.getInputStream());BufferedReader buffer_reader = new BufferedReader(reader);PrintWriter writer = new PrintWriter(socket.getOutputStream());String readline = "Hello!";writer.println(readline);writer.flush();String response = buffer_reader.readLine();System.out.println("Server say:"+ response);writer.close(); buffer_reader.close(); socket.close(); }}

public class Server {//服务器端public static void main(String[] args) throws Exception{ServerSocket server = new ServerSocket(888);Socket socket = server.accept(); InputStreamReader reader = new InputStreamReader(socket.getInputStream());BufferedReader buffer_reader=new BufferedReader(reader);PrintWriter writer=new PrintWriter(socket.getOutputStream());String request = buffer_reader.readLine();System.out.println("Client say:" + request);String line="Hello,too!";writer.println(line);writer.flush();writer.close();buffer_reader.close();socket.close();server.close();}}

5.3.3)例子:(一对多通信)

public class Client {public static void main(String[] args) throws Exception{Socket socket = new Socket("127.0.0.1",888);InputStreamReader reader = new InputStreamReader(socket.getInputStream());BufferedReader buffer_reader = new BufferedReader(reader);PrintWriter writer = new PrintWriter(socket.getOutputStream());String readline = "Hello!";writer.println(readline);writer.flush();String response = buffer_reader.readLine();System.out.println("Server say:"+ response);writer.close(); buffer_reader.close(); socket.close(); }}

public class Server1 {public static void main(String[] args) throws Exception {ServerSocket server = new ServerSocket(888);while (true) {Socket socket = server.accept();SocketHandler handler = new SocketHandler(socket);//负责套接字和流的处理Thread thread = new Thread(handler);//新进程thread.start();}}}

public class SocketHandler implements Runnable {private Socket socket;public SocketHandler(Socket socket) {this.socket = socket;}public void run() {try {InputStreamReader reader = new InputStreamReader(socket.getInputStream());BufferedReader buffer_reader = new BufferedReader(reader);PrintWriter writer = new PrintWriter(socket.getOutputStream());while (true) {String client = "<" + socket.getInetAddress().toString() + " : "+ socket.getPort() + ">";String request = buffer_reader.readLine();if(request.startsWith("<loginout")){break;}System.out.println(client + " say:" + request);String line = client + " Hello,too!";writer.println(line);writer.flush();}writer.close();buffer_reader.close();socket.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

5.4)UDP编程

5.4.1)核心类


5.4.2)例子

public class Client {public static void main(String[] args) {   try {   // 创建发送方的套接字,IP默认为本地,端口号随机   DatagramSocket sendSocket = new DatagramSocket();  // 确定要发送的消息:   String mes = "你好!接收方!";   // 由于数据报的数据是以字符数组传的形式存储的,所以传转数据   byte[] buf = mes.getBytes();   // 确定发送方的IP地址及端口号,地址为本地机器地址   int port = 8888;   InetAddress ip = InetAddress.getLocalHost();   // 创建发送类型的数据报:   DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, ip,  port);   // 通过套接字发送数据:   sendSocket.send(sendPacket);  // 确定接受反馈数据的缓冲存储器,即存储数据的字节数组   byte[] getBuf = new byte[1024];   // 创建接受类型的数据报   DatagramPacket getPacket = new DatagramPacket(getBuf, getBuf.length);   // 通过套接字接受数据   sendSocket.receive(getPacket);   // 解析反馈的消息,并打印   String backMes = new String(getBuf, 0, getPacket.getLength());   System.out.println("接受方返回的消息:" + backMes);   // 关闭套接字   sendSocket.close();   } catch (Exception e) {   e.printStackTrace();   }  }}

public class Server {public static void main(String[] args) {try {InetAddress ip = InetAddress.getLocalHost();int port = 8888;// 创建接收方的套接字,并制定端口号和IP地址DatagramSocket getSocket = new DatagramSocket(port, ip); // 确定数据报接受的数据的数组大小byte[] buf = new byte[1024]; // 创建接受类型的数据报,数据将存储在buf中DatagramPacket getPacket = new DatagramPacket(buf, buf.length); // 通过套接字接收数据getSocket.receive(getPacket);String getMes = new String(buf, 0, getPacket.getLength());System.out.println("对方发送的消息:" + getMes);InetAddress sendIP = getPacket.getAddress();int sendPort = getPacket.getPort();System.out.println("对方的地址是:" + sendIP.getHostAddress() + ":"+ sendPort);// 通过数据报得到发送方的套接字地址SocketAddress sendAddress = getPacket.getSocketAddress();String feedback = "接收方说:我收到了!";byte[] backBuf = feedback.getBytes();DatagramPacket sendPacket = new DatagramPacket(backBuf,backBuf.length, sendAddress);getSocket.send(sendPacket);getSocket.close();} catch (Exception e) {e.printStackTrace();}}}


5.5)HTTP编程

HTTP是一个构件于TCP之上的应用层协议。。所以编程也是建立在TCP连接上的

例子:

public class Server {public static void main(String[] args) throws Exception {ServerSocket server = new ServerSocket(8010);Socket socket = server.accept();BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter pw = new PrintWriter(socket.getOutputStream());char[] buffer = new char[1024];int len = br.read(buffer);StringBuffer reqStr = new StringBuffer();for (int i = 0; i < len; i++) {reqStr.append(buffer[i]);}System.out.print(reqStr.toString());pw.println("<h1>Hello World!</h1>");pw.flush();socket.close();}}

HTTP的响应




原创粉丝点击