黑马程序员_网络编程

来源:互联网 发布:上古卷轴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参考模型。只分为:应用层,传输层,网际层,主机至网络层,一般来说开发处于传输层和网际层,应用层为:FTPHTTP协议等,传输层为:UDPTCP等,网际层为:IP

通常用户操作的是应用层,而编程人员需要做的是传输层和网际层,用户在应用层操作的数据,经过逐层封包,最后到物理层发送到另一个模型中,再进行逐层解包。

传输协议:

通信规则,最常用的协议为:TCPUDP协议



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培训、期待与您交流! -------


0 0
原创粉丝点击