黑马程序员-网络编程
来源:互联网 发布:淘宝如何刷销量 编辑:程序博客网 时间: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();}}
- 【黑马程序员】网络编程
- 黑马程序员 网络编程
- 黑马程序员:网络编程
- 黑马程序员-------网络编程
- 黑马程序员-网络编程
- 黑马程序员:网络编程
- 黑马程序员--网络编程
- 黑马程序员--网络编程
- 黑马程序员-网络编程
- 黑马程序员-------网络编程
- 黑马程序员-网络编程
- 黑马程序员-----网络编程
- 黑马程序员-网络编程
- 黑马程序员-网络编程
- 黑马程序员 网络编程
- 黑马程序员----- 网络编程
- 黑马程序员 网络编程
- 黑马程序员--网络编程
- 硬件工程师电路设计十大要点
- 放假第一天——给博客挂了个广告
- CentOS 6.3 yum 安装 memcached
- 敏捷开发“松结对编程”系列之十七:L型代码结构(编程篇之二)(中)
- MongoDB索引操作
- 黑马程序员-网络编程
- java 列表、集合与数组之间的转化
- Android定位
- 详解Linux命令行下常用svn命令
- list c++template
- ThinkPHP学习笔记(十八)数据库表的关联操作
- My new csdn blog
- java 对数组进行排序
- Inno Setup安装、卸载时判断是否程序正在运行