网络编程:
互联网中的IP地址 InetAddress
/**
端口号:逻辑端口由操作系统负责,对每个程序进行分配
0-65535 1024之前的端口号被系统的软占用了
http:www.xxxx.com:80 默认
*/
package net1;
import java.net.InetAddress;
import java.net.UnknownHostException;
/*
* 表示互联网中的IP地址
* java.net.InetAddress
* 静态方法:
* static InetAddrss getLocalHost() 本地主机
* static InetAdderss getByName(String hostName) 传递主机名,获取IP地址对象
*
* 非静态方法:
* String getHostName() 获取主机名
* String getHostAddress() 获取主机地址
*/
public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
// function();
function_2();
}
private static void function_2() throws UnknownHostException {
InetAddress inet = InetAddress.getByName("comput");
System.out.println(inet);
}
private static void function() throws UnknownHostException {
//输出结果就是主机名和ip地址
System.out.println(InetAddress.getLocalHost());
InetAddress inet = InetAddress.getLocalHost();
String host = inet.getHostName();
String add = inet.getHostAddress();
System.out.println(host + add);
}
}
端口号:逻辑端口由操作系统负责,对每个程序进行分配
0-65535 1024之前的端口号被系统的软占用了
http:www.xxxx.com:80 默认
import java.net.InetAddress;
import java.net.UnknownHostException;
/*
* 表示互联网中的IP地址
* java.net.InetAddress
* 静态方法:
* static InetAddrss getLocalHost() 本地主机地址
* static InetAdderss getByName(String hostName) 传递主机名,获取IP地址对象
*
* 非静态方法:
* String getHostName() 获取主机名
* String getHostAddress() 获取主机地址
*/
public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
// function();
function_2();
}
private static void function_2() throws UnknownHostException {
InetAddress inet = InetAddress.getByName("comput");
System.out.println(inet);
}
private static void function() throws UnknownHostException {
//输出结果就是主机名和ip地址
System.out.println(InetAddress.getLocalHost());
InetAddress inet = InetAddress.getLocalHost();
String host = inet.getHostName();
String add = inet.getHostAddress();
System.out.println(host + add);
}
}
UDP:
/*
* UDP 是无连接通信协议
* 数据限制在64kb以内
* 发送端不用确定接收端是否在线就会发出数据
* 接收端收到数据时也不会反馈是否收到数据
* 消耗资源小,效率高,即使丢失部分数据包,也不会对结果产生太大影响
*
* TCP 面向连接的协议
* 传输数据前先建立连接,提供毫无差错的数据传输
*/
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* 实现UDP协议的发送端:
* 实现封装数据的类:java.net.DatagramPacket 将数据包装
* 实现数据传输的类:java.net.DatagramSocket 将数据包发出去
*
* 实现步骤:
* 1.创建DatagramPacket对象,封装数据,接收的地址和端口
* 2.创建DatagramScoket对象
* 3.调用DatagramScoket类方法send,发送数据包
* 4.关闭资源
*
* DatagramPacket构造方法:
* DatagramPacket(byte[] buf,int length,InetAddress address,int port)
* DatagramScoket构造方法:
* DategramSocket()
* 方法:send(DategramPacket d)
*/
public class UDPsend {
public static void main(String[] args) throws IOException{
InetAddress inet = InetAddress.getByName("127.0.0.1");
byte[] buf = "hello".getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,inet,6000);
DatagramSocket ds = new DatagramSocket();
ds.send(dp);
ds.close();
}
}
package udpDemo;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* 实现UDP接收端
* 实现封装数据包 java.net.DatagramPacket 接收数据
* 实现输出传输 java.net.DatagramSocket 接收数据包
*
* 实现步骤:
* 1.创建DatagramSocket对象,绑定端口号(和发送端一致)
* 2.创建字节数组,接收发来的数据
* 3.创建数据包对象DatagramPacket
* 4.调用DategramSocket对象方法
* receive(DatagramPacket dp) 接收数据,数据存放在数据包中
* 5.拆包:
* 发送的IP地址 数据包对象DatagramPacket方法InetAddress getAddress()
* 接收的字节个数 数据包对象DatagramPacket方法int getLength()
* 发送方的端口号 数据包对象DatagramPacket方法int getPort()
* 6.关闭资源
*/
public class UDPreceive {
public static void main(String[] args) throws IOException{
DatagramSocket ds = new DatagramSocket(6000);
byte[] data = new byte[1024];
DatagramPacket dp = new DatagramPacket(data, data.length);
ds.receive(dp);
//获取发送端端口号
int port = dp.getPort();
//获取发送端IP地址
InetAddress ip = dp.getAddress();
//获取接收到的字节长度
int length = dp.getLength();
System.out.println(port);
System.out.println(ip);
System.out.println(new String(data,0,length));
ds.close();
}
}
/*
* 制作无限循环的发送(模拟聊天工具)
*/
public class UDPsend {
public static void main(String[] args) throws IOException{
InetAddress inet = InetAddress.getByName("127.0.0.1");
Scanner sc = new Scanner(System.in);
DatagramSocket ds = new DatagramSocket();
while(true) {
String message = sc.nextLine();
if(message.equals("我去洗澡了"))
ds.close();
byte[] buf = message.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,inet,6000);
ds.send(dp);
}
//ds.close();
}
}
public class UDPreceive {
public static void main(String[] args) throws IOException{
DatagramSocket ds = new DatagramSocket(6000);
byte[] data = new byte[1024];
DatagramPacket dp = new DatagramPacket(data, data.length);
while(true) {
ds.receive(dp);
int length = dp.getLength();
String message = new String(data,0,length);
if(message.equals("我去洗澡了"))
ds.close();
int port = dp.getPort();
InetAddress ip = dp.getAddress();
System.out.println(message+"..."+ip+"..."+port);
}
//ds.close();
}
}
TCP:
* 实现TCP客户端,连接到服务器
* 和服务器实现数据交换
* 实现TCP客户端的类java.net.Socket
*
* 构造方法:
* Socket(String host,int port) 传递服务器ip和端口号
* 注意:只要构造方法运行,就会和服务器进行连接,连接失败抛异常
* OutputStream getOutputStream() 返回套接字的输出流 作用:将数据输出到服务器
* InputStream getInputStream() 返回套接字的输入流 作用:从服务器读取数据
public class TCPClient {
public static void main(String[] args) throws IOException{
Socket socket = new Socket("127.0.0.1", 18435);
OutputStream out = socket.getOutputStream();
out.write("你好,世界".getBytes());
//接收服务器的消息
InputStream in = socket.getInputStream();
byte[] data = new byte[1024];
int len = in.read(data);
System.out.println(new String(data,0,len));
socket.close();
}
* 实现TCP套接字程序
* 表示服务器程序的类java.net.ServerSocket
* 构造方法:
* ServerSocket(int port) 传递端口号
*
* 获得客户端套接字对象Socket
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(18435);
Socket socket = server.accept();
InputStream in = socket.getInputStream();
byte[] data = new byte[1024];
int len = in.read(data);
//不能用循环,len不会=-1 用循环会一直等待客户端写入
System.out.println(new String(data,0,len));
//服务器回消息
OutputStream out = socket.getOutputStream();
out.write("你好,人类".getBytes());
server.close();
socket.close();
}
}
/**
* 客户端向服务器上传图片
*/
package tcpDemo2;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",8000);
OutputStream out = socket.getOutputStream();
FileInputStream in = new FileInputStream("G:\\java\\a.jpg");
byte[] data = new byte[1024*8];
int len = 0;
while((len = in.read(data)) != -1) {
out.write(data,0,len);
}
socket.shutdownOutput();//告诉服务器已停止写入不要读了,终止序列
//接收服务器的回复消息
byte[] b = new byte[1024];
int length = socket.getInputStream().read(b);
System.out.println(new String(b,0,length));
socket.close();
in.close();
}
}
* 1.ServerSocket套接字对象监听接口8000
* 2.方法accept() 获取客户端连接对象
* 3.客户端连接对象获取字节输入流,读取客户端发送的图片
* 4.创建File文件,绑定上传文件夹(判断文件夹是否存在,不存在就创建)
* 5.创建字节输出流文件File对象在文件夹中
* 6.字节流读取图片,字节流将图片写入目的的文件夹中
* 7.将上传成功发送给客户端
* 8.关闭资源
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8000);
Socket socket = server.accept();
InputStream in = socket.getInputStream();
File upload = new File("G:\\net");
if(!upload.exists())
upload.mkdirs();
//防止重名,定义命名规则
String FileName = "cdd"+System.currentTimeMillis()+".jpg";
FileOutputStream out = new FileOutputStream(upload+File.separator+FileName);
byte[] data = new byte[1024];
int len = 0;
while((len = in.read(data)) != -1) {
out.write(data,0,len);
}
//服务器回复
socket.getOutputStream().write("上传成功".getBytes());
server.close();
out.close();
}
}
**********************************************************************
/**
*
*/
package tcpThread;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",8000);
OutputStream out = socket.getOutputStream();
FileInputStream in = new FileInputStream("G:\\java\\a.jpg");
byte[] data = new byte[1024*8];
int len = 0;
while((len = in.read(data)) != -1) {
out.write(data,0,len);
}
socket.shutdownOutput();//告诉服务器已停止写入不要读了,终止序列
//接收服务器的回复消息
byte[] b = new byte[1024];
int length = socket.getInputStream().read(b);
System.out.println(new String(b,0,length));
socket.close();
in.close();
}
}
/**
*
*/
package tcpThread;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;
/*
* 建立服务器线程
* 连接一个客户端建立一个服务器线程
* 此线程接收socket套接字
*/
public class UpLoad implements Runnable{
private Socket socket;
public UpLoad(Socket socket) {
this.socket = socket;
}
public void run() {
try {
InputStream in = socket.getInputStream();
File upload = new File("G:\\net");
if(!upload.exists())
upload.mkdirs();
//防止重名,定义命名规则
String FileName = "cdd"+System.currentTimeMillis()+".jpg";
FileOutputStream out = new FileOutputStream(upload+File.separator+FileName);
byte[] data = new byte[1024];
int len = 0;
while((len = in.read(data)) != -1) {
out.write(data,0,len);
}
//服务器回复
socket.getOutputStream().write("上传成功".getBytes());
out.close();
socket.close();
}catch(Exception e) {
}
}
}
package tcpThread;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPThreadServer {
public static void main(String[] args) throws IOException{
ServerSocket server = new ServerSocket(8000);
while(true) {
Socket socket = server.accept();
Thread t = new Thread(new UpLoad(socket));
t.start();
}
}
}