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.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的响应
- 【网络编程】JAVA网络编程
- java网络编程:网络基本概念
- Java网络编程-UDP编程
- Java 高层网络编程
- Java网络编程2
- Java网络编程3
- Java网络编程4
- Java网络服务器编程
- java网络编程1
- java网络编程2
- JAVA网络编程
- Java网络服务器编程
- java网络编程
- Java 高层网络编程
- Java 高层网络编程
- Java网络服务器编程
- Java网络编程
- JAVA网络编程
- Android面试题目之常见的填空题和简答题
- Linux 中ps 和 top命令详解
- shell编程--运算符
- Patrick and Shopping
- Unity中实时检测当前手机网络,网络切换时给用户一个提示
- java网络编程
- super关键字,super关键字和this关键字的区别
- HDU
- eclipse 下导入外部jar包的3种方式
- HashSet元素不重复底层比较
- Python绘制图标基础
- 面试---算法排序基础(1)
- JDBC之使用Spring提供的JdbcTemplate进行数据库操作
- B1021