黑马程序员——网络编程

来源:互联网 发布:登录宁夏网络测评平台 编辑:程序博客网 时间:2024/06/07 15:21

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

概述

网络编程(三要素):

1.找到对方的IP;

2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识,即端口(逻辑端口);

3.定义通信规则。这个通讯规则称为协议,国际组织定义了通用的协议TCP/IP。


IP的基本知识:

IP地址范围:0-255;

特殊的IP地址:127.0.0.1(本地回环地址,可以在cmd中ping它来测试网卡);

端口范围:0-65535,其中0-1024端口系统保留自用了。

常见的默认的端口:

MySQL:3306

Web:80

Tocat:8080

IP地址的取得(InetAddress类在java.net包中)

例:

InetAddress i=InetAddress.getLocalHost();

System.out.println(i.toString());


InetAddress[] getAllByName("www.baidu.com");//取得百度主机的地址


网络传输的两种方式的区别(必背)

UDP:

①将数据及源和目的封装成数据包,不需要建立连接

②每个数据包的大小在64K内

③因为无连接,所以是不可靠协议

④因为不需要连接,所以速度快


TCP:

建立连接,形成传输数据的通道

在连接中进行大量数据的传输

通过三次握手完成连接,是可靠的协议

必须建立连接,效率会稍低


UDP

DatagramSocket:用于发送和接收数据报包的套接字。
需求:通过UDP传输方式,将一段文字数据发送出去
思路:
1.建立UDPsocket服务
2.提供数据,并将数据封装到数据包中
3.通过socket服务的发送功能,将数据包发送出去
4.关闭资源

DatagramSocket ds=new DatagramSocket();//建立UDPsocket服务

byte[] buf="UDP gemenlaile".getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.12"),10000);//创建数据包,里面封装的有数据和要发送出去的IP地址及端口

ds.send(dp);//用send()方法将数据包发出去

dp.close();//关闭资源


UDP接收端:

思路:

1.定义UDPsocket服务

2.定义一个数据包,因为要存储接收到的字节数据。数据包对象有更多功能可以提取字节数据中不同数据的信息

3.通过socket服务的receive()方法将接收到的数据存入已定义好的数据包中

4.通过数据包的特有功能,将这些不同的数据取出,打印到控制台上

5.关闭资源

DatagramSocket ds=new DatagramSocket(10000);//创建UDPsocket端点并指定其监听的端口


byte[] buf=new byte[1024];

DatagramPacket dp=new DatagramPacket(buf,buf.length);//定义数据包,用于存储数据


ds.receive(dp);//通过receive方法接收数据到dp里面


String ip=dp.getAddress().getHostAddress();

String data=new String(dp.getData(),0,dp.getLength());

int port=dp.getPort();

System,out.print(ip+"::"+data+"::"+port);//通过数据包的各种获取

ds.close();//关闭资源


TCP

Socket和ServerSocket
建立客户端和服务端
建立连接后,通过Socket的IO流进行数据的传输

客户端:
该对象建立时,就可以去连接指定的主机,因为TCP是面向连接的,所以在建立socket服务时,就要有服务端的存在,并连接成功形成通路后,在该通道上进行传输
需求:给服务端发送一个文本数据
Socket s=new Socket("192.168.1.254",10000);//创建Socket服务,并指定要连接主机的IP和端口
OutputStream.out=s.getOutputStream();//为了发送数据,应获取socket中的输出流
out.write("TCP,I am  coming".getBytes());//将数据写入到输出流中
s.close();


服务端:

1.建立服务端的Socket服务。ServerSocket

2.获取连接过来的客户端对象。通过ServerSocket的accept()方法,没有连接就等,所以这个方法是阻塞式方法

3.客户端如果发送过来数据,那么服务端要使用对应的客户端对象。并获取到该客户端对象的读取流读取发过来的数据

4.关闭服务端

ServerSocket ss=new ServerSocket(10000);//建立服务端Socket服务,并监听10000端口

Socket s=ss.accept();//通过accept()方法来获取连接过来的客户端对象,阻塞式方法

InputStream in=s.getInputStream();//获取客户端的读取流来获得客户端发过来的对象

byte[] buf=new byte[1024];

int len=in.read(buf);//通过客户端输入流读取数据

System.out.println("buf,0,len");

s.close();//关闭客户端

ss.close();//关闭服务端(实际应用一般不用关闭)


TCP传输的客服互访

思路:

客户端Socket s对象连接服务器;

服务端ServerSocket ss通过accept()方法接收客户端的s对象

通过两端的s.InputStream()和s.OutputStream()互访


练习:建立一个文本转换服务器,代码如下:

package com.ken;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.Socket;import java.net.UnknownHostException;public class TCPClient {/** * 客户端,发数据给服务器,并且接收服务器返回的数据 * @throws IOException  * @throws UnknownHostException  */public static void main(String[] args) throws UnknownHostException, IOException {Socket s=new Socket("127.0.0.1",10004);OutputStream out=s.getOutputStream();BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(out));BufferedReader br=new BufferedReader(new InputStreamReader(System.in));String line=null;InputStream in=s.getInputStream();BufferedReader brin=new BufferedReader(new InputStreamReader(in));while((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();line=brin.readLine();System.out.println(line);}br.close();bw.close();brin.close();s.close();}}
package com.ken;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;public class TCPServer {/** * 建立一个文本转换服务器,将接收到的字母以大写或者小写写回客户端 * @throws IOException  */public static void main(String[] args) throws IOException {ServerSocket ss=new ServerSocket(10004);Socket s=ss.accept();BufferedReader br= new BufferedReader(new InputStreamReader(s.getInputStream()));BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line=null;while((line=br.readLine())!=null){bw.write(line.toUpperCase());bw.newLine();bw.flush();}s.close();br.close();bw.close();}}

这两段代码要注意的地方:

①使用IO记得刷新

②readLine()方法需要换行符,而恰好newLine()方法提供换行符

0 0