黑马程序员-网络编程

来源:互联网 发布:淘宝如何刷销量 编辑:程序博客网 时间:2024/05/17 06:30

------- android培训、java培训、期待与您交流! ----------

1:网络编程(理解)

(1)java语言实现多台计算机间的通信。(理解)

(2)网络模型(了解)

OSI7层参考模型

TCP/IP四层模式

(3)网络编程三要素(掌握)

A:IP地址

ip地址的一些基本知识。

InetAddress类的基本使用。

B:端口号

用于标识网络程序的进程的逻辑地址

范围:0-65535

0-1024为系统使用或者保留端口。不建议使用。

通过360可以查看当前软件使用的端口号。

C:协议

UDP

发送的是数据包。

不需要建立连接。

数据不可靠。

效率高,速度快。

TCP

建立通道发送数据。

需要建立连接。

数据可靠。

效率低,速度慢。

UDP
        将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快
TCP
        建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低

(4)Socket(理解)

Socket就像一个港口。

Socket就是为网络编程提供的一种机制;

通信的两端都有Socket

网络通信其实就是Socket间的通信;

数据在两个Socket间通过IO传输;

(5)UDP案例(掌握)

发送端的步骤:

A:创建发送端的Socket对象

B:把数据打包

C:发送数据

D:释放资源

代码体现:

DatagramSocket ds = new DatagramSocket();

byte[] bys = "hello,udp,我来了".getBytes();

DatagramPacket dp = new DatagramPacket(bys,bys.length,

InetAddress.getByName("192.168.1.100"),10000);

ds.send(dp);

ds.close();

接收端的步骤:

A:创建接收端的Socket对象

B:创建数据包,用于接收数据

C:接收数据

D:解析数据

E:释放资源

代码体现:

DatagramSocket ds = new DatagramSocket(10000);

byte[] bys = new byte[1024];

DatagramPacket dp = new DatagramPacket(bys,bys.length);

ds.receive(dp);

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

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

Sysetm.out.println(ip+"***"+text);

ds.close();

案例:(理解)

键盘录入数据

IP地址改为广播地址

用多线程改进

(6)TCP案例(掌握)

客户端步骤

A:创建客户端的Socket对象

B:获取输出流对象

C:写数据

D:释放资源

代码体现:

Socket s = new Socket(InetAddress.getByName("192.168.1.100"),12345);

OutputStream os = s.getOutputStream();

os.write("hello,tcp,我来了".getBytes());

s.close();

服务器端的步骤

A:创建服务器端的Socket对象

B:获取输入流对象

C:读数据

D:释放资源

代码体现:

ServerSocket ss = new ServerSocket(12345);

Socket s = ss.accept();

InputStream is = s.getInputStream();

byte[] bys = new byte[1024];

int len = is.read(bys);

String text = new String(bys,0,len);

System.out.println("text:"+text);

s.close();

ss.close();

案例:(理解)

服务器给客户端一个反馈

键盘录入数据,服务器转成大写返回。

PrintWriter改写。

服务器端代码

package cn.itcast.tcp;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class ServerDemo3 {public static void main(String[] args) throws IOException {// 创建服务器的Socket对象ServerSocket ss = new ServerSocket(12345);// 获取客户端对象Socket s = ss.accept();// 读取客户端数据BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(//s.getOutputStream()));PrintWriter pw=new PrintWriter(s.getOutputStream());String line = null;while ((line = br.readLine()) != null) {// System.out.println(line+"***");// 转成大写写回去//bw.write(line.toUpperCase());//bw.newLine();//bw.flush();pw.println(line.toUpperCase());pw.flush();}// 释放资源s.close();ss.close();}}

客户端代码

package cn.itcast.tcp;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.InetAddress;import java.net.Socket;/* * 需求:客户端写入数据,服务器转成大写,返回给客户端。 *  * 客户端(写数据abc) -- 服务器(读数据abc) -- 转换(ABC) -- 服务器 (写数据ABC) -- 客户端(读数据ABC) *  * 问题: * 在客户端数据不显示,原因: * 1:客户端数据没有发送成功 * 2:服务器反馈不成功 * 通过测试,是由于1产生的。我们通过思考,就想到了,数据在缓冲区。必须flush。 * 当我们flush后,服务器还是没有收到数据,我们又得思考了,readLine()有一个特点 * 是根据换行符进行读取一行数据的。我们在写数据的时候,没有写换行符,所以数据过不去。 *  */public class ClientDemo3 {public static void main(String[] args) throws IOException {// 创建客户端的Socket服务Socket s = new Socket(InetAddress.getByName("192.168.1.104"), 12345);// 录入数据BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 客户端写数据/* * OutputStream os = s.getOutputStream(); // 转换流 OutputStreamWriter osw * = new OutputStreamWriter(os); // 包装 BufferedWriter bw = new * BufferedWriter(osw); *///BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(//s.getOutputStream()));PrintWriter pw=new PrintWriter(s.getOutputStream());// 用于获取服务器的反馈BufferedReader brServer = new BufferedReader(new InputStreamReader(s.getInputStream()));String line = null;while ((line = br.readLine()) != null) {if ("over".equals(line)) {break;}//bw.write(line);//bw.newLine();//bw.flush();//System.out.print("server:" );pw.println(line);pw.flush();// 获取服务器的反馈String server = brServer.readLine(); //阻塞System.out.println("server:" + server);}// 释放资源br.close();s.close();}}


作业:把PrintWriter改写的代码加注释。

思考题:如何用TCP实现一个文本文件的传输。

客户端代码

package cn.itcast.Test;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.io.PrintWriter;import java.net.InetAddress;import java.net.Socket;//如何用TCP实现一个文本文件的传输。public class FileClientTest {public static void main(String[] args) throws IOException {//创建客户端的Socket服务Socket s=new Socket(InetAddress.getByName("192.168.1.124"),10000);//客户端写数据PrintWriter pw=new PrintWriter(s.getOutputStream(),true);//读取客户端文本数据BufferedReader bufr=new BufferedReader( new FileReader("d:\\day27总结.txt"));String line=null;//读取客户端数据while((line=bufr.readLine())!=null){//写入客户端数据,发送服务器端pw.println(line);}//释放资源bufr.close();s.close();}}

服务器端代码

package cn.itcast;import java.io.BufferedReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;/* * 上传文件的服务器 */public class UploadServer {public static void main(String[] args) throws IOException {// 创建服务器的Socket对象ServerSocket ss = new ServerSocket(8080);// 获取客户端Socket s = ss.accept();// 读数据写数据BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));PrintWriter pw = new PrintWriter(new FileWriter("Copy.java"), true);String line = null;while ((line = br.readLine()) != null) {//if ("over".equals(line)) {//break;//}pw.println(line);}// 反馈PrintWriter pw2 = new PrintWriter(s.getOutputStream(), true);pw2.println("上传文件成功");pw.close();s.close();ss.close();}}

群聊其实就是把接收端ip设为192.168.1.255

接收端代码

package cn.itcast.Test;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;public class QunLiaoReceiver {public static void main(String[] args) throws IOException {// 创建Socket服务对象DatagramSocket s = new DatagramSocket(10000);while (true) {// 将数据打包byte[] bys = new byte[1024];DatagramPacket dp = new DatagramPacket(bys, bys.length);// 解析数据包并显示s.receive(dp);System.out.println(new String(bys, 0, dp.getLength()));}// 释放资源//s.close();}}
发送端代码

package cn.itcast.Test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class QunLiaoSend {public static void main(String[] args) throws IOException {// 创建Socket服务对象DatagramSocket ds = new DatagramSocket();BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String line = null;while ((line = br.readLine()) != null) {// 将数据打包byte[] bys = line.getBytes();DatagramPacket dp = new DatagramPacket(bys, bys.length,InetAddress.getByName("192.168.1.255"), 10000);// 调用发送方法ds.send(dp);}// 释放资源ds.close();}}



原创粉丝点击