网络编程:

一、osi和TCP协议对照:

二、通讯三要素:

三、InetAddress对象简述:

 import java.net.InetAddress;
import java.net.UnknownHostException; public class IpClassDemo
{
public static void main(String[] args) throws UnknownHostException{
demo();
} public static void demo() throws UnknownHostException{
//InetAddress没有构造方法,不能直接创建对象
//获取本机
InetAddress ip=InetAddress.getLocalHost();
//获取其他主机
ip=InetAddress.getByName("k01");
System.out.println(ip.getHostAddress());
System.out.println(ip.getHostName());
} }

InetAddress

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

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

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

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

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

UDP发送端演示

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

UDP接收端演示

 import java.io.IOException;
import java.net.DatagramSocket; public class UDPTest {
/*这是UDP协议的聊天室,使用UDPSendTest2和UDPReceiveTest2,
* 其实就是添加了多线程
*/
public static void main(String[] args) throws IOException {
DatagramSocket send=new DatagramSocket();
DatagramSocket rece=new DatagramSocket(13419);
UDPSendTest2 usend=new UDPSendTest2(send);
UDPReceiveTest2 urece=new UDPReceiveTest2(rece);
Thread t1=new Thread(usend);
Thread t2=new Thread(urece);
t1.start();
t2.start();
} }

UDP简单聊天室

 import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UDPSendTest2 implements Runnable{
private DatagramSocket ds;
public UDPSendTest2(DatagramSocket ds){
this.ds=ds;
}
public void run(){
try{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=br.readLine())!=null){
byte[] buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("172.25.14.5"), 13419);
ds.send(dp);
if(line.equals("886")){
break;
}
}
ds.close();
}catch(Exception e){
}
}
}

聊天室发送端

 import java.net.DatagramPacket;
import java.net.DatagramSocket; public class UDPReceiveTest2 implements Runnable{
private DatagramSocket ds;
public UDPReceiveTest2(DatagramSocket ds){
this.ds=ds;
}
public void run(){
try{
while(true){
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length); ds.receive(dp);
String context=new String(dp.getData(),0,dp.getLength());
System.out.println("内容是:"+context);
if(context.equals("886")){
System.out.println("对方退出聊天");
}
}
}catch(Exception e){
}
} }

聊天室接收端

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

服务器端-->ServerSocket

客户端---->Socket

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

TCP客户端演示

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

TCP服务器端演示

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException; public class TCPClientTest { public static void main(String[] args) throws UnknownHostException, IOException {
//TCPTest是用TCP协议建立一个服务器端,对客户端传来的数据进行大小写转换,使用键盘录入
demo();
} public static void demo() throws UnknownHostException, IOException {
Socket s=new Socket("172.25.14.9", 7999);
OutputStream os=s.getOutputStream();
PrintStream out=new PrintStream(os); BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
String str=null;
while((str=br.readLine())!=null){
if(str.equals("over")){
break;
}
out.println(str);
//上面一句相当于下面一句
//out.print(str+"\r\n");
//out.flush();
String upperStr=brIn.readLine();
System.out.println(upperStr);
} s.close();
}
}

TCP大小写转换客户端

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket; public class TCPServerTest { public static void main(String[] args) throws IOException {
demo();
} public static void demo() throws IOException {
ServerSocket ss=new ServerSocket(7999); Socket s=ss.accept();
InputStream is=s.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is));
OutputStream os=s.getOutputStream();
PrintStream out=new PrintStream(os,true);
String str=null;
while((str=br.readLine())!=null){
out.println(str.toUpperCase());
}
s.close();
ss.close();
} }

TCP大小写转换服务器端

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.FileReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException; public class TCPUploadClient { public static void main(String[] args) throws UnknownHostException, IOException {
demo();
} public static void demo() throws UnknownHostException, IOException {
Socket s=new Socket("172.25.14.4", 7999);
OutputStream os=s.getOutputStream();
PrintStream out=new PrintStream(os); BufferedReader br=new BufferedReader(new FileReader("D:\\2.txt"));
String str=null;
while((str=br.readLine())!=null){
out.println(str);
} //因为TCP两端都有阻塞式方法,为了结束通讯过程,Java的socket对象提供了TCP通讯结束标记,
s.shutdownOutput(); BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
String context=brIn.readLine();
System.out.println(context);
br.close();
s.close();
}
}

TCP文本文件上传客户端

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.FileWriter;
import java.io.PrintStream; public class TCPUploadServer { public static void main(String[] args) throws IOException {
demo();
} public static void demo() throws IOException {
ServerSocket ss=new ServerSocket(7999); Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"....connect");
InputStream is=s.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is));
BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\1.txt"));
OutputStream os=s.getOutputStream();
PrintStream out=new PrintStream(os,true);
String str=null;
while((str=br.readLine())!=null){
if(str.equals("over")){
break;
}
bw.write(str);
bw.newLine();
bw.flush();
}
out.println("get");
bw.close();
s.close();
ss.close();
} }

TCP文本文件上传服务器端

六、服务器和客户端

ip:

Java学习笔记十的更多相关文章

  1. Java学习笔记十五:Java中的成员变量和局部变量

    Java中的成员变量和局部变量 一:成员变量: 成员变量在类中定义,用来描述对象将要有什么 成员变量可以被本类的方法使用,也可以被其他类的方法使用,成员变量的作用域在整个类内部都是可见的 二:局部变量 ...

  2. Java学习笔记十九:Java中的访问控制修饰符

    Java中的访问控制修饰符 一:Java修饰符的种类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class Hello ...

  3. Java学习笔记十八:Java面向对象的三大特性之封装

    Java面向对象的三大特性之封装 一:面向对象的三大特性: 封装 继承 多态   二:封装的概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访 ...

  4. Java学习笔记十六:Java中的构造方法

    Java中的构造方法 1.使用new+构造方法 创建一个新的对象: 2.构造方法是定义在Java类中的一个用来初始化对象的方法: 3.构造方法与类同名且没有返回值: 4.语法格式: public 构造 ...

  5. Java学习笔记十四:如何定义Java中的类以及使用对象的属性

    如何定义Java中的类以及使用对象的属性 一:类的重要性: 所有Java程序都以类class为组织单元: 二:什么是类: 类是模子,确定对象将会拥有的特征(属性)和行为(方法): 三:类的组成: 属性 ...

  6. Java学习笔记十二:Java中方法的重载

    Java中方法的重载 什么是方法的重载呢? 如果同一个类中包含了两个或两个以上方法名相同.方法参数的个数.顺序或类型不同的方法,则称为方法的重载,也可称该方法被重载了.如下所示 4 个方法名称都为 s ...

  7. Java学习笔记十:Java的数组以及操作数组

    Java的数组以及操作数组 一:什么是数组: 数组可以理解为是一个巨大的“盒子”,里面可以按顺序存放多个类型相同的数据,比如可以定义 int 型的数组 scores 存储 4 名学生的成绩 数组中的元 ...

  8. Java学习笔记(十)面向对象---接口

    理解 初期理解 可以认为接口是一个特殊的抽象类.当接口中的方法都是抽象的,那么该类可以通过接口的形式来表示. class用于定义类 interface用于定义接口 格式特点 接口中常见定义:常量,抽象 ...

  9. Java学习笔记十二--集合(三)

    第一节课 返回值 方法名 作用 void add(index,elemnet) 在指定的索引处添加元素 object get(index) 返回指定索引处的元素 int indexOf(object) ...

随机推荐

  1. PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(4)

    2.4 调整检查点和XLOG 目前为止,这一章已经提供深入洞察PostgreSQL如何写入数据,一般来说,XLOG是用来干什么的.考虑到这方面的知识,我们现在可以继续并学习我们能做些什么来使我们的数据 ...

  2. java中移位操作

    /** * * @author SunRain *2013-10-14 8:09:50 *在最后一个移位运算中,结果没有直接付给b,而是直接打印出来,所以结果是正确的, *其他的是会被先转换成int型 ...

  3. 由浅入深讲解数据库中Synonym的使用方法

    1.Synonym的概念 Synonym(同义词)是SQL Server 2005的新特性.推出已经有几年的时间了.我们可以简单的理解Synonym为其他表的别名.本文中使用Northwind数据库为 ...

  4. Passpoint R1

    Passpoint R1 自从 Android 6.0 支持从网络下载包含配置文件和凭据信息的特殊文件来配置 Passpoint R1(第 1 版)凭据,Android 就一直支持 Passpoint ...

  5. JAVA版本区块链钱包核心代码

    Block.java package com.ppblock.blockchain.core; import java.io.Serializable; /** * 区块 * @author yang ...

  6. 新机器的vim配置

    最近一直用vim去写acm代码,算是一种练习吧. 用着用着感觉不错,最近也稍微配置了一下vim,用着更舒服了 键盘映射 ESC<->CapsLock 我们知道vim有自带的键盘映射命令,但 ...

  7. 【转载】Perl中字符串编码的处理

    在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编 ...

  8. Laravel核心解读--HTTP内核

    Http Kernel Http Kernel是Laravel中用来串联框架的各个核心组件来网络请求的,简单的说只要是通过public/index.php来启动框架的都会用到Http Kernel,而 ...

  9. Vue+ElementUI: 手把手教你做一个audio组件

    目的 本项目的目的是教你如何实现一个简单的音乐播放器(这并不难) 本项目并不是一个可以用于生产环境的element播放器,所以并没有考虑太多的兼容性问题 本项目不是ElementUI的一个音频插件,只 ...

  10. python中一些有用的函数------持续更新中

    strip() 函数 用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列. str2 = " Runoob " # 去除首尾空格 print (str2.strip()) ...