黑马程序员_网络编程
来源:互联网 发布:上古卷轴5优化补丁 编辑:程序博客网 时间:2024/06/05 04:58
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
网络编程:
网络通讯要素:
1、IP地址
2、端口号
3、传输协议
IP地址:
(1)、它是网络中的设备标识 //每台主机都有自己的IP地址,这样才能将数据发送到指定的地方
(2)、不易记忆,可用主机名表示,两者存在映射关系//如:www.baidu.com
(3)、本机回环地址:127.0.0.1,主机名为:localhost。
Java将IP地址封装成了一个对象,存在于java.net包中:InetAddress类
InetAddress类常用方法:
1、getLocalHost()此方法是静态的,可以获取InetAddress对象
2、static InetAddress getByName(String host):获取指定主机的IP和主机名
3、getHostAddress:获取本地地址
示例:
<span style="font-size:18px;">import java.net.InetAddress;public class IPDemo {public static void main(String[] args) throws Exception {//static InetAddress getLocalHost() 返回本地主机地址和名称。InetAddress i = InetAddress.getLocalHost();System.out.println(i.toString());//获取本地IP地址(最为常用)String IPAddress = i.getHostAddress();//获取本地主机名称String HostName = i.getHostName();//获取任意一台主机IP地址//static InetAddress getByName(String host) InetAddress ia = InetAddress.getByName("www.baidu.com");System.out.println(ia.toString());}}</span>端口号:
1、数据要发送到对方指定的应用程序上。为了标识这些应用程序,所以给这些网络应用程序(例如QQ)都用数字进行标识,为了方便称呼这个数字,叫做端口(逻辑端口)。
2、用于标识进程的逻辑地址,不同进程的标识不同
3、有效端口:0~65535,其中0~1024端口为系统使用或保留端口。
注意:进行通信连接时,一定要指定端口才能发送到对方指定的应用程序上。
网络模型:OSI参考模型和TCP/IP参考模型
OSI参考模型分为:应用层,表示层,会话层,传输层, 通信层,网络层,数据链路层,物理层;
TCP/IP参考模型简化了OSI参考模型。只分为:应用层,传输层,网际层,主机至网络层,一般来说开发处于传输层和网际层,应用层为:FTP和HTTP协议等,传输层为:UDP和TCP等,网际层为:IP。
通常用户操作的是应用层,而编程人员需要做的是传输层和网际层,用户在应用层操作的数据,经过逐层封包,最后到物理层发送到另一个模型中,再进行逐层解包。
传输协议:
通信规则,最常用的协议为:TCP和UDP协议
Socket
1,什么是Socket
网络服务提供的一种机制,通信两端都要有Socket,才能进行数据的传输,数据在两个Socket间通过IO传输。
2,Socket通讯的过程
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写操作;
(4) 关闭Socket.
UDP:
1、面向无连接,不需要建立连接
2、将数据及源和目的封装成数据包,每个数据包的大小限制在64K内
3、不可靠,因为无连接,是不可靠协议
4、速度快,因为不用建立连接
UDP应用:
通常应用应用与聊天,视频会议,桌面共享等即使丢失数据也不妨碍进行的通信。
UDP示例:
<span style="font-size:18px;">/*udp发送端:*/import java.net.*;class UdpSend {public static void main(String[] args)throws Exception {//1、通过DatagramSocket对象创建UDP服务。DatagramSocket datagramSocket=new DatagramSocket();//2、确定数据,并封装成数据包。byte[] buf="Hello World".getBytes();DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.152.1"),8888);//3、通过Socket服务,将已有的数据包发送出去。通过send方法。datagramSocket.send(dp);//4、关闭资源datagramSocket.close();}}/*udp接收端*/class UdpReceive{public static void main(String[] args)throws Exception{//1、创建udp Socket服务,建立端点DatagramSocket ds=new DatagramSocket(8888);//2、定义数据包。用于存储数据byte[] buf=new byte[1024];DatagramPacket dp=new DatagramPacket(buf,buf.length);//3、通过Socket服务的receive方法将接收到的数据存入数据包中ds.receive(dp);//阻塞式方法,当没有数据可以接收时,程序会停止运行,等待数据。//4、通过数据包的方法获取其中的数据String ip=dp.getAddress().getHostName();String data=new String(dp.getData(),0,dp.getLength());int port=dp.getPort();System.out.println(ip+"::"+data+"::"+port);//5、关闭资源ds.close();}}}</span>TCP:
1、面向连接,建立连接,形成传输数据的通道。
2、在连接中进行大数据量的传输
3、通过三次握手完成协议,是可靠协议//第一次本方发送请求,第二次对方确认连接,第三次本方再次确认连接成功。
4、必须建立连接,效率稍低
<span style="font-size:18px;">import java.io.*;import java.net.*;/*客户端*/public class ClientText {/*服务端读取客户端键盘录入的信息,并将其转成大写。 */public static void main(String[] args) throws Exception {// TODO Auto-generated method stubSocket s = new Socket("192.168.152.1",10005);//读取键盘录入BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//将数据输出到服务端BufferedWriter bufout = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));//接收服务端发送过来的数据BufferedReader bufrin = new BufferedReader(new InputStreamReader(s.getInputStream()));String line = null;while((line=bufr.readLine())!=null){if("over".equals(line))break;bufout.write(line);bufout.newLine();bufout.flush();String str = bufrin.readLine();System.out.println("服务端说:"+str);}s.close();bufr.close();}}/*服务端*/class ServerText{public static void main(String[] args) throws Exception{//端口号必须和客户端指定的端口号一致ServerSocket ss = new ServerSocket(10005);//通过accept方法接收一个通信对象Socket s = ss.accept();//接收客户端的数据BufferedReader bufrin = new BufferedReader(new InputStreamReader(s.getInputStream()));//发送数据到客户端BufferedWriter bufout = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line = null;while((line=bufrin.readLine())!=null){bufout.write(line.toUpperCase());bufout.newLine();bufout.flush();}s.close();ss.close();}}</span>
TCP上传图片:
<span style="font-size:18px;">/*客户端*/package cn.itcast.net.p1.uploadpic;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class UploadPicClient {/** * @param args * @throws IOException * @throws UnknownHostException */public static void main(String[] args) throws UnknownHostException, IOException {//1,创建客户端socket。Socket s = new Socket("192.168.1.100",10006);//2,读取客户端要上传的图片文件。FileInputStream fis = new FileInputStream("c:\\0.bmp");//3,获取socket输出流,将读到图片数据发送给服务端。OutputStream out = s.getOutputStream();byte[] buf = new byte[1024];int len = 0;while((len=fis.read(buf))!=-1){out.write(buf,0,len);}//告诉服务端说:这边的数据发送完毕。让服务端停止读取。s.shutdownOutput();//读取服务端发回的内容。 InputStream in = s.getInputStream();byte[] bufIn = new byte[1024];int lenIn = in.read(buf);String text = new String(buf,0,lenIn);System.out.println(text);fis.close();s.close();}}</span>
<span style="font-size:18px;">/*服务端*/package cn.itcast.net.p1.uploadpic;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;public class UploadPicServer {/** * @param args * @throws IOException */public static void main(String[] args) throws IOException {//创建tcp的socket服务端。ServerSocket ss = new ServerSocket(10006);while(true){Socket s = ss.accept();new Thread(new UploadTask(s)).start();}//获取客户端。//ss.close();}}</span>
<span style="font-size:18px;">/*定义线程*/package cn.itcast.net.p1.uploadpic;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;public class UploadTask implements Runnable {private static final int SIZE = 1024*1024*2;private Socket s;public UploadTask(Socket s) {this.s = s;}@Overridepublic void run() {int count = 0;String ip = s.getInetAddress().getHostAddress();System.out.println(ip + ".....connected");try{// 读取客户端发来的数据。InputStream in = s.getInputStream();// 将读取到数据存储到一个文件中。File dir = new File("c:\\pic");if (!dir.exists()) {dir.mkdirs();}File file = new File(dir, ip + ".jpg");//如果文件已经存在于服务端 while(file.exists()){file = new File(dir,ip+"("+(++count)+").jpg");}FileOutputStream fos = new FileOutputStream(file);byte[] buf = new byte[1024];int len = 0;while ((len = in.read(buf)) != -1) {fos.write(buf, 0, len);if(file.length()>SIZE){System.out.println(ip+"文件体积过大");fos.close();s.close();System.out.println(ip+"...."+file.delete());return ;}}// 获取socket输出流,将上传成功字样发给客户端。OutputStream out = s.getOutputStream();out.write("上传成功".getBytes());fos.close();s.close();}catch(IOException e){}}}</span>
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 黑马程序员_网络编程
- 如何写一个发微博的页面(包括插入图片,插入表情,插入话题,插入Location) (一)
- Eclipse配置tomcat发布路径的问题
- 阿里云上部署niginx+php+mysql
- 接口层报文输出
- LaunchMode
- 黑马程序员_网络编程
- redhat samba服务器配置注意事项
- 数据库相关学习
- IBM的界面设计原则阅读笔记
- telnet不能用,提示:-bash: telnet: command not found
- 7715平台修改BUG记录
- 排序汇总
- [剑指offer]面试题22:栈的压入、弹出序列
- android camera 学习