Java学习笔记十
网络编程:
一、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学习笔记十的更多相关文章
- Java学习笔记十五:Java中的成员变量和局部变量
Java中的成员变量和局部变量 一:成员变量: 成员变量在类中定义,用来描述对象将要有什么 成员变量可以被本类的方法使用,也可以被其他类的方法使用,成员变量的作用域在整个类内部都是可见的 二:局部变量 ...
- Java学习笔记十九:Java中的访问控制修饰符
Java中的访问控制修饰符 一:Java修饰符的种类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class Hello ...
- Java学习笔记十八:Java面向对象的三大特性之封装
Java面向对象的三大特性之封装 一:面向对象的三大特性: 封装 继承 多态 二:封装的概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访 ...
- Java学习笔记十六:Java中的构造方法
Java中的构造方法 1.使用new+构造方法 创建一个新的对象: 2.构造方法是定义在Java类中的一个用来初始化对象的方法: 3.构造方法与类同名且没有返回值: 4.语法格式: public 构造 ...
- Java学习笔记十四:如何定义Java中的类以及使用对象的属性
如何定义Java中的类以及使用对象的属性 一:类的重要性: 所有Java程序都以类class为组织单元: 二:什么是类: 类是模子,确定对象将会拥有的特征(属性)和行为(方法): 三:类的组成: 属性 ...
- Java学习笔记十二:Java中方法的重载
Java中方法的重载 什么是方法的重载呢? 如果同一个类中包含了两个或两个以上方法名相同.方法参数的个数.顺序或类型不同的方法,则称为方法的重载,也可称该方法被重载了.如下所示 4 个方法名称都为 s ...
- Java学习笔记十:Java的数组以及操作数组
Java的数组以及操作数组 一:什么是数组: 数组可以理解为是一个巨大的“盒子”,里面可以按顺序存放多个类型相同的数据,比如可以定义 int 型的数组 scores 存储 4 名学生的成绩 数组中的元 ...
- Java学习笔记(十)面向对象---接口
理解 初期理解 可以认为接口是一个特殊的抽象类.当接口中的方法都是抽象的,那么该类可以通过接口的形式来表示. class用于定义类 interface用于定义接口 格式特点 接口中常见定义:常量,抽象 ...
- Java学习笔记十二--集合(三)
第一节课 返回值 方法名 作用 void add(index,elemnet) 在指定的索引处添加元素 object get(index) 返回指定索引处的元素 int indexOf(object) ...
随机推荐
- Saying Good-bye to Cambridge Again
Saying Good-bye to Cambridge Again Very quietly I take my leave, As quietly as I came here; ...
- jdk--rpm.bin文件安装, zip解压与创建
3,执行命令赋予安装文件777权限: # cd /usr/java(mkdir java –此目录需要创建) ①jdk-1_5_0_16-linux-i586-rpm.bin文件安装 # chmod ...
- php八大设计模式之观察者模式
例如在登录时,需要判断用户是第几次登录,登录过于频繁我们就给用户提示异常.根据用户的爱好,在用户登录后给予相应的猜你喜欢.如果都在 登录时判断密码的方法内完成,不符合面向对对象的单一职责.那我们该怎么 ...
- NPashaP的二分图源码部分
源码链接:https://github.com/nelsonkuang/ant-admin/blob/master/src/utils/d3-viz.js 的二分图部分. 1.整体的级联结构 整个bp ...
- 洛谷1005 【NOIP2007】矩阵取数游戏
问题描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- HDU 4406 GPA
GPA Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 440664 ...
- [React] Implement a Higher Order Component with Render Props
When making a reusable component, you'll find that people often like to have the API they're most fa ...
- android 推断是否支持闪光灯
近期在做录制视频功能,在找一些资料时发现 要推断是否支持闪关灯,在这记录下来,怕以后忘记 public static boolean isSupportCameraLedFlash(PackageMa ...
- 动态网页爬取样例(WebCollector+selenium+phantomjs)
目标:动态网页爬取 说明:这里的动态网页指几种可能:1)须要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成.如一个html里有<div id="test" ...
- js插件---图片懒加载echo.js结合 Amaze UI ScrollSpy 使用
js插件---图片懒加载echo.js结合 Amaze UI ScrollSpy 使用 一.总结 一句话总结:图片懒加载echo.js结合 Amaze UI ScrollSpy 使用的效果就是:懒加载 ...