Java学习笔记(Javase毕向东版视频)十

网络编程:

一、osi和TCP协议对照:

二、通讯三要素:

三、InetAddress对象简述:

 1 import java.net.InetAddress;
 2 import java.net.UnknownHostException;
 3
 4 public class IpClassDemo
 5 {
 6     public static void main(String[] args) throws UnknownHostException{
 7         demo();
 8     }
 9
10     public static void demo() throws UnknownHostException{
11         //InetAddress没有构造方法,不能直接创建对象
12         //获取本机
13         InetAddress ip=InetAddress.getLocalHost();
14         //获取其他主机
15         ip=InetAddress.getByName("k01");
16         System.out.println(ip.getHostAddress());
17         System.out.println(ip.getHostName());
18     }
19
20 }

InetAddress

socket:套接字,网络编程的基础。发送端和接收端都需要socket。

四、UDP实现:首先Java封装了UDP所使用的socket对象-->DatagramSocket,可以简单的获取并加以使用。

UDP是协议,所以要完成通讯,还需要体现另外两个要素:ip和端口。

ip是在发送端使用,指定接收端的地址,端口是发送端和接收端数据交换的线程号

 1 import java.io.IOException;
 2 import java.net.DatagramPacket;
 3 import java.net.DatagramSocket;
 4 import java.net.InetAddress;
 5
 6 public class UDPSendDemo {
 7     public static void main(String[] args) throws IOException{
 8         System.out.println("发送端启动...");
 9         sendemo();
10     }
11
12     public static void sendemo() throws IOException {
13         /*使用UDP发送数据需要四步,
14          * 1、建立发送端的socket服务,对于UDP协议来说就是创建DatagramSocket对象
15          * 2、将数据封包,对于UDP协议来说使用的是DatagramPacket对象。!!!该对象还可以用于拆包数据
16          * 3、使用socket服务发送:这里需要使用通讯协议的另外两个点-->1、接收端的ip,2、端口
17          * 注意:传输的信息会被接收端的对应端口接收
18          * 4、关闭socket服务
19          */
20         DatagramSocket ds=new DatagramSocket();
21
22         String context="UDP发送演示";
23         byte[] buf=context.getBytes();
24
25         DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("192.16.25.16"), 10000);
26
27         ds.send(dp);
28
29         ds.close();
30     }
31 }

UDP发送端演示

 1 import java.io.IOException;
 2 import java.net.DatagramPacket;
 3 import java.net.DatagramSocket;
 4
 5 public class UDPReceiveDemo {
 6
 7     public static void main(String[] args) throws IOException {
 8         System.out.println("接收端启动...");
 9         receivedemo();
10     }
11
12     public static void receivedemo() throws IOException {
13         /*使用UDP接收数据和发送过程类似
14          * 1、建立发送端的socket服务,!!!需要明确端口号
15          * 2、创建数据包,准备存储和解析数据
16          * 3、使用socket的receive()接收数据存入准备好的解析对象中
17          * 4、使用数据包的解析方法解析数据,即拆包.可以解析出发送端地址,端口,数据内容等信息
18          * 5、关闭socket服务
19          */
20         DatagramSocket ds=new DatagramSocket(10000);
21
22         byte[] buf=new byte[1024];
23         DatagramPacket dp=new DatagramPacket(buf, buf.length);
24
25         ds.receive(dp);            //阻塞式,在接收到信息之前一直阻塞
26         String ip=dp.getAddress().getHostAddress();
27         int port=dp.getPort();
28         String context=new String(dp.getData(),0,dp.getLength());
29         System.out.println("ip是"+ip+",端口是"+port+",内容是\""+context+"\"");
30
31         ds.close();
32     }
33
34 }

UDP接收端演示

 1 import java.io.IOException;
 2 import java.net.DatagramSocket;
 3
 4 public class UDPTest {
 5     /*这是UDP协议的聊天室,使用UDPSendTest2和UDPReceiveTest2,
 6      * 其实就是添加了多线程
 7      */
 8     public static void main(String[] args) throws IOException {
 9         DatagramSocket send=new DatagramSocket();
10         DatagramSocket rece=new DatagramSocket(13419);
11         UDPSendTest2 usend=new UDPSendTest2(send);
12         UDPReceiveTest2 urece=new UDPReceiveTest2(rece);
13         Thread t1=new Thread(usend);
14         Thread t2=new Thread(urece);
15         t1.start();
16         t2.start();
17     }
18
19 }

UDP简单聊天室

 1 import java.io.BufferedReader;
 2 import java.io.InputStreamReader;
 3 import java.net.DatagramPacket;
 4 import java.net.DatagramSocket;
 5 import java.net.InetAddress;
 6
 7 public class UDPSendTest2 implements Runnable{
 8     private DatagramSocket ds;
 9     public UDPSendTest2(DatagramSocket ds){
10         this.ds=ds;
11     }
12     public void run(){
13         try{
14             BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
15             String line=null;
16             while((line=br.readLine())!=null){
17                 byte[] buf=line.getBytes();
18                 DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("172.25.14.5"), 13419);
19                 ds.send(dp);
20                 if(line.equals("886")){
21                     break;
22                 }
23             }
24             ds.close();
25         }catch(Exception e){
26         }
27     }
28 }

聊天室发送端

 1 import java.net.DatagramPacket;
 2 import java.net.DatagramSocket;
 3
 4 public class UDPReceiveTest2 implements Runnable{
 5     private DatagramSocket ds;
 6     public UDPReceiveTest2(DatagramSocket ds){
 7         this.ds=ds;
 8     }
 9     public void run(){
10         try{
11             while(true){
12                 byte[] buf=new byte[1024];
13                 DatagramPacket dp=new DatagramPacket(buf, buf.length);
14
15                 ds.receive(dp);
16                 String context=new String(dp.getData(),0,dp.getLength());
17                 System.out.println("内容是:"+context);
18                 if(context.equals("886")){
19                     System.out.println("对方退出聊天");
20                 }
21             }
22         }catch(Exception e){
23         }
24     }
25
26 }

聊天室接收端

五、TCP实现:TCP协议比UDP复杂,在Java中表现在区分服务器端和客户端不同的socket对象。

服务器端-->ServerSocket

客户端---->Socket

 1 import java.io.IOException;
 2 import java.io.OutputStream;
 3 import java.net.Socket;
 4 import java.net.UnknownHostException;
 5
 6 public class TCPClientDemo {
 7
 8     public static void main(String[] args) throws UnknownHostException, IOException {
 9         demo();
10     }
11
12     public static void demo() throws UnknownHostException, IOException {
13         /*TCP传输客户端的建立过程:
14          * 1、创建客户端socket服务,使用Socket对象
15          *         建议:一旦创建该对象,就明确要连接的主机地址
16          * 2、如果连接成功,会生成一个通道。在Java中表现为socket流,
17          *   有输入流和输出流,对应的对象可以通过Socket对象获取
18          *   getOutputStream()    --》获取输出流
19          *      getInputStream()    --》获取输入流
20          * 3、使用输出流发送数据,还可以接受服务器端反馈的数据
21          * 4、关闭资源
22          */
23         Socket s=new Socket("172.25.14.9", 10002);
24         OutputStream os=s.getOutputStream();
25         os.write("TCP演示".getBytes());
26         s.close();
27     }
28
29 }

TCP客户端演示

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.net.ServerSocket;
 6 import java.net.Socket;
 7
 8 public class TCPServerDemo {
 9
10     public static void main(String[] args) throws IOException {
11         /*TCP和UDP的一个不同是:TCP是面向连接的,
12          * 就是说要先开启服务器端,在开启客户端,两端相连接才能通讯
13          * 而UDP只要两端开启就可以通讯
14          */
15         demo();
16     }
17
18     public static void demo() throws IOException {
19         /*
20          * 建立TCP服务器端的过程
21          * 1、建立服务器端的socket服务,使用ServerSocket对象
22          *       !!! 注意:服务器端必须提供一个端口给客户端使用,否则无法连接
23          * 2、获取正在连接的客户端socket对象,并使用该对象对应的通道,即socket流进行数据发送
24          *      !!!注意:这是因为  服务器端需要和多个客户端进行数据交换,这样可以保证数据不会传错
25          * 3、关闭资源,包括客户端和服务器端。
26          */
27         ServerSocket ss=new ServerSocket(10002);
28
29         //accept()是阻塞式,在服务器端开启后会一直阻塞,直到有传输数据进入才会执行下一步操作
30         Socket s=ss.accept();
31         InputStream is=s.getInputStream();
32
33         BufferedReader br=new BufferedReader(new InputStreamReader(is));
34         System.out.println(br.readLine());
35
36         s.close();
37         ss.close();
38     }
39
40 }

TCP服务器端演示

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 import java.io.OutputStream;
 5 import java.io.PrintStream;
 6 import java.net.Socket;
 7 import java.net.UnknownHostException;
 8
 9 public class TCPClientTest {
10
11     public static void main(String[] args) throws UnknownHostException, IOException {
12         //TCPTest是用TCP协议建立一个服务器端,对客户端传来的数据进行大小写转换,使用键盘录入
13         demo();
14     }
15
16     public static void demo() throws UnknownHostException, IOException {
17         Socket s=new Socket("172.25.14.9", 7999);
18         OutputStream os=s.getOutputStream();
19         PrintStream out=new PrintStream(os);
20
21         BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
22         BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
23         String str=null;
24         while((str=br.readLine())!=null){
25             if(str.equals("over")){
26                 break;
27             }
28             out.println(str);
29             //上面一句相当于下面一句
30             //out.print(str+"\r\n");
31             //out.flush();
32             String upperStr=brIn.readLine();
33             System.out.println(upperStr);
34         }
35
36         s.close();
37     }
38 }

TCP大小写转换客户端

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.io.PrintStream;
 7 import java.net.ServerSocket;
 8 import java.net.Socket;
 9
10 public class TCPServerTest {
11
12     public static void main(String[] args) throws IOException {
13         demo();
14     }
15
16     public static void demo() throws IOException {
17         ServerSocket ss=new ServerSocket(7999);
18
19         Socket s=ss.accept();
20         InputStream is=s.getInputStream();
21
22         BufferedReader br=new BufferedReader(new InputStreamReader(is));
23         OutputStream os=s.getOutputStream();
24         PrintStream out=new PrintStream(os,true);
25         String str=null;
26         while((str=br.readLine())!=null){
27             out.println(str.toUpperCase());
28         }
29         s.close();
30         ss.close();
31     }
32
33 }

TCP大小写转换服务器端

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 import java.io.OutputStream;
 5 import java.io.FileReader;
 6 import java.io.PrintStream;
 7 import java.net.Socket;
 8 import java.net.UnknownHostException;
 9
10 public class TCPUploadClient {
11
12     public static void main(String[] args) throws UnknownHostException, IOException {
13         demo();
14     }
15
16     public static void demo() throws UnknownHostException, IOException {
17         Socket s=new Socket("172.25.14.4", 7999);
18         OutputStream os=s.getOutputStream();
19         PrintStream out=new PrintStream(os);
20
21         BufferedReader br=new BufferedReader(new FileReader("D:\\2.txt"));
22         String str=null;
23         while((str=br.readLine())!=null){
24             out.println(str);
25         }
26
27         //因为TCP两端都有阻塞式方法,为了结束通讯过程,Java的socket对象提供了TCP通讯结束标记,
28         s.shutdownOutput();
29
30         BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
31         String context=brIn.readLine();
32         System.out.println(context);
33         br.close();
34         s.close();
35     }
36 }

TCP文本文件上传客户端

 1 import java.io.BufferedReader;
 2 import java.io.BufferedWriter;
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.InputStreamReader;
 6 import java.io.OutputStream;
 7 import java.net.ServerSocket;
 8 import java.net.Socket;
 9 import java.io.FileWriter;
10 import java.io.PrintStream;
11
12 public class TCPUploadServer {
13
14     public static void main(String[] args) throws IOException {
15         demo();
16     }
17
18     public static void demo() throws IOException {
19         ServerSocket ss=new ServerSocket(7999);
20
21
22         Socket s=ss.accept();
23         String ip=s.getInetAddress().getHostAddress();
24         System.out.println(ip+"....connect");
25         InputStream is=s.getInputStream();
26
27         BufferedReader br=new BufferedReader(new InputStreamReader(is));
28         BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\1.txt"));
29         OutputStream os=s.getOutputStream();
30         PrintStream out=new PrintStream(os,true);
31         String str=null;
32         while((str=br.readLine())!=null){
33             if(str.equals("over")){
34                 break;
35             }
36             bw.write(str);
37             bw.newLine();
38             bw.flush();
39         }
40         out.println("get");
41         bw.close();
42         s.close();
43         ss.close();
44     }
45
46 }

TCP文本文件上传服务器端

六、服务器和客户端

ip:

时间: 2024-12-30 04:09:50

Java学习笔记(Javase毕向东版视频)十的相关文章

Java学习笔记(Javase毕向东版视频)七 常用API对象三

一.泛型:简单说就是对对象类型进行限定的技术 public class GenericDemo { public static void main(String[] args){ /*泛型作为1.5版之后的新技术,分两步使用 * 1.在类名之后用<类型参数>,这里就像函数中的普通参数一样命名即可 * 2.在生成对象和返回该对象参数时需要明确具体的类型,相当于传入实参 * 上面说的是泛型类,除此之外,泛型还可以用于类中方法和接口 */ GenericTest<Person> gt=n

Java学习笔记(Javase毕向东版视频)二.2

5.运算符:变量的意义就在于可以进行运算,运算需要用运算符来表示,分为以下几种 1 class test 2 { 3 public static void main(String[] args) 4 { 5 //赋值运算符 =(赋值) +=,-=,*=,/= 6 int a=1234,b; 7 8 /*算数运算符 +(加) -(减) *(乘) /(除) %(取余) ++(自增) --(自减) +(字符串连接) 9 *1.除法运算结果自动转换为int型. 10 *2.取余结果的正负取决于被除数 1

Java学习笔记(Javase毕向东版视频)三.2

5.继承 1 //Java中所有对象都显式/隐式的继承子Object类 2 class fu{ 3 fu(){ 4 System.out.println("fu..."+getNum()); 5 show(); 6 } 7 private int num=3; 8 public void setNum(int num){ 9 this.num=num; 10 } 11 public int getNum(){ 12 return num; 13 } 14 public void sho

Java学习笔记(Javase毕向东版视频)三

1.面向过程思想,强调的是过程(即动作,函数):面向对象思想,强调的是对象. 2.类与对象关系:类是对事物的描述(属性和行为-方法),对象是类的实例.对象通过new生成.属性也称成员变量;方法也称成员函数. 1 /*Java代码都是在类中的,以下是Java的两种不同类:区别在于是否有main方法. 2 * 有main函数的可以独立运行,且main函数是程序的入口 3 * 如果没有main函数,就像其他面向对象的语言一样,通过new一个实例来运行 4 */ 5 6 public class Obj

Java学习笔记(Javase毕向东版视频)九

GUI:图形用户界面,Java不常用于创建桌面应用,所以用的比较少 一.概述: 二.Frame演示: 三.事件监听机制 1 import java.awt.Button; 2 import java.awt.FlowLayout; 3 import java.awt.Frame; 4 import java.awt.TextField; 5 import java.awt.event.KeyAdapter; 6 import java.awt.event.KeyEvent; 7 import j

Java学习笔记(Javase毕向东版视频)八

IO流:就是input/output输入/输出流. 一.字节流操作文件的便捷类:FileWriter和FileReader 1 import java.io.FileWriter; 2 import java.io.IOException; 3 4 public class FileWriterDemo { 5 private static final String LINE_SEPARATOR=System.getProperty("line.separator"); 6 publi

Java学习笔记(Javase毕向东版视频)四

1.简介.进程和线程:简单的说就是进程负责为程序开辟内存空间,线程负责具体的执行单元(执行路径). 一个进程中可以有多个执行路径,称为多线程.CPU一次只能执行一个进程,但是一个进程内部可以有多个线程在执行. 最早的多进程,多线程效果其实是CPU进行快速切换的效果,由于切换速率很快用户不能发现.现在可以使用多CPU来实现. 参考:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 2.线程状态图 3.线程的创建:进程

Java学习笔记(Javase毕向东版视频)六 常用API对象二

1.基本数据类型对象包装类:见下图 1 public class Test { 2 public static void main(String[] args){ 3 Demo(); 4 toStringDemo(); 5 jdkDemo(); 6 } 7 8 private static void jdkDemo() { 9 //注意:在1.5之后的版本中可以使用下面的形式 简化书写 ,这是版本升级的一个方面 10 Integer i=3; //自动装箱,jdk是Integer i = Int

Java学习笔记(Javase毕向东版视频)五 常用API对象一

常用API:字符串操作:String类,StringBuffer类,StringBulider类 字符串是最重要的数据类型之一,处理字符串也是一种语言的基本工作. 1.String类: 1 public class StringDemo { 2 public static void main(String[] args) 3 { 4 StringDemo1(); 5 } 6 protected static void StringDemo1() 7 { 8 /*java中有两种创建String对