------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
五、网络编程
1. InetAddress对象
import java.net.*;
class IPDemo
{
public static void main(String[] args) throws Exception
{
//InetAddress i = InetAddress.getLocalHost();
//sop(i.toString());
//sop(i.getHostAddress());
//sop(i.getHostName());
InetAddress ia = InetAddress.getByName("www.baidu.com");
sop(ia.getHostAddress());
sop(ia.getHostName());
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
2. 发送端与接收端socket通信
import java.net.*;
import java.util.*;
import java.text.*;
/*
需求:通过udp传输方式将一段文字数据发送出去
思路:
1,建立udpsocket服务
2,提供数据并将数据封装到数据包中
3,通过socket服务的发送功能,将数据包发出
4,关闭资源
*/
class UdpSend
{
public static void main(String[] args) throws Exception
{
//1,创建udp服务,通过DatagramSocket对象
DatagramSocket ds = new DatagramSocket(12135);
while (true)
{
Scanner sc = new Scanner(System.in);
String s = sc.next();
//2,确定数据,并封装成数据包
byte[] buf = s.getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("169.254.225.241"),10258);
//3,通过socket服务,将已有数据包发出去,通过send服务。
ds.send(dp);
//4,关闭资源。
}
}
}
/*
定义一个应用程序,用于接udp协议收数据并处理。
定义udpsocket服务,通常会监听一个端口,其实就是给这个网络应用程序定义一个数字标示
方便于明确哪些数据过来应用程序可以处理
思路:
1,定义udpsocket服务。
2,定义一个数据包,因为要存储接收到的字节数据,因为数据包中有更多功能可以提取字节数据中的不同信息
3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中
4,通过数据包对象的特有功能,将这些不同的数据取出打印在控制台上
5,关闭资源
*/
class Udprece
{
public static void main(String[] args) throws Exception
{
//1,创建udp socket,建立端点。
DatagramSocket ds = new DatagramSocket(10258);//指定端口号
//定义数据包,用于存储数据
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//通过服务的receive方法收到数据存入数据包中
while (true)
{
ds.receive(dp);
//4,通过数据包的方法获取数据
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
sop(sdf.format(d));
int port = dp.getPort();
sop(ip+":"+data);
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
3. Chat聊天程序(UDP协议)
/*
编写一个聊天程序
收数据和发数据同时执行
需要用到多线程技术
*/
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;
class Send implements Runnable
{
private DatagramSocket ds;
Send(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
try
{
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line=bufr.readLine())!=null)
{
if("88".equals(line))
break;
byte[] buf = line.getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length
,InetAddress.getByName("169.254.225.241"),10258);
ds.send(dp);
}
}
catch (IOException e)
{
throw new RuntimeException("发送信息失败");
}
}
}
class Rece implements Runnable
{
private DatagramSocket ds;
Rece(DatagramSocket ds)
{
this.ds=ds;
}
public void run()
{
try
{
while (true)
{
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//通过服务的receive方法收到数据存入数据包中
ds.receive(dp);
//4,通过数据包的方法获取数据
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
sop(sdf.format(d));
int port = dp.getPort();
sop(ip+":"+data);
}
}
catch (IOException e)
{
throw new RuntimeException("接收信息失败");
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class ChatDemo
{
public static void main(String[] args) throws Exception
{
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(10258);
new Thread(new Send(sendSocket)).start();
new Thread(new Rece(receSocket)).start();
}
}
4. TCP协议
/*
演示tcp传输
1,tcp分客户端和服务端
2,客户端对应的对象是Socket
服务端对应的对象是服务端
*/
/*
客户端
通过查阅socket对象,发现在该对象监理师,就可以去连接指定主机
因为tcp是面向连接的,所以在建立socket服务时
就要有服务端存在,并连接成功,形成通路后,在该通道进行数据传输
//需求:给服务端发送一个文本数据
步骤
1,创建Socket服务并指定要连接的主机和端口
*/
import java.io.*;
import java.net.*;
class TcpClient
{
public static void main(String[] args) throws Exception
{
//创建客户端socket服务,指定目的主机和端口
Socket s = new Socket("169.254.225.241",10003);
//为了发送数据,应该获取socket流中的输出流
OutputStream os = s.getOutputStream();
os.write("huanghaihahahahaha".getBytes());
//获取socket流中的输入流,将服务器反馈的数据获取到,并打印
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
sop(new String(buf,0,len));
s.close();
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
/*
需求:定义端点的接收数据并打印在控制台上
服务端:
1,建立服务端的socket服务,ServerSocket对象
并监听一个端口。
2,获取连接过来的客户端对象。
通过ServerSocket的accept()方法,所以这个方法是阻塞式的
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据
并打印在控制台
4,关闭服务端。(可选)
*/
class TcpServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10003);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
sop(ip+".....connected");
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
sop(new String(buf,0,len));
OutputStream os = s.getOutputStream();
Thread.sleep(10000);
os.write("传输成功".getBytes());
s.close();
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
5.客户端服务端程序
/*
需求:建立一个文本转换服务器
客户端给服务端发送文本,服务端会将文本转换成大写再返回给客户端
而且客户端可以不断的进行文本转换,当客户端输入over转换结束
*/
import java.io.*;
import java.net.*;
import java.util.*;
class Client
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("169.254.225.241",10005);
while (true)
{
OutputStream os = s.getOutputStream();
Scanner sc = new Scanner(System.in);
String str = sc.next();
if ("over".equals(str))
break;
else
{
os.write(str.getBytes());
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
sop("收到服务器返回值:"+new String(buf,0,len));
}
}
s.close();
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class Server
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10005);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
sop(ip+"已连接!!");
while (true)
{
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
OutputStream os = s.getOutputStream();
os.write((new String(buf,0,len).toUpperCase()).getBytes());
sop("已返回数据!!");
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
6.文件上传服务器与客户端代码
class Server
{
public static void main(String[] args)
{
ServerSocket ss = new ServerSocket(10086);
while (true)
{
Socket s = ss.accept();
new Thread(new ServerThread(s)).start();
}
}
}
class ServerThread implements Runnable
{
private Socket s;
ServerThread(Socket s)
{
this.s = s;
}
public void run()
{
int count = 0;
String ip = s.getInetAddress().getHostAddress();
try
{
System.out.println(ip+"...connected");
InputStream in = s.getInputStream();
File file = new File(ip+"("+(count)+")"+".jpg");
while(file.exists())
file = new File(ip+"("+(count++)+")"+".jpg");
FileOutputStream fos = new FileOutputStream("server.bmp");
byte[] buf = new byte[1024];
int len = 0;
while ((len=in.read(buf))!=-1)
{
fos.write(buf,0,len);
}
OutputStream out = s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();
}
catch ()
{
throw new RuntimeException(ip+"上传失败");
}
}
}
class Client
{
public static void main(String[] args)
{
if(args.length!=1)
{
System.out.println("请选择一个文件");
return;
}
File file = new File(args[0]);
if(!(file.exists()&&file.isFile()))
{
System.out.println("该文件有问题");
return;
}
if(!file.getName().endsWith(".jpg"))
{
System.out.println("文件格式错误");
return;
}
if(file.length()>1024*1024*5)
{
System.out.println("文件过大");
return;
}
Socket s = new Socket("",10086);
FileInputStream fis = new FileInputStream(file);
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[] buf = new byte[1024];
}
}
7. URL
方法摘要 | |
boolean | |
getAuthority() | |
getContent() | |
getContent(Class[] classes) | |
int | getDefaultPort() |
getFile() | |
getHost() | |
getPath() | |
int | getPort() |
getProtocol() | |
getQuery() | |
getRef() | |
getUserInfo() | |
int | hashCode() |
openConnection() | |
openConnection(Proxy proxy) | |
openStream() | |
boolean | |
protected void | set(String protocol, String host, int port, String file, String ref) |
protected void | set(String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref) |
static void | setURLStreamHandlerFactory(URLStreamHandlerFactory fac) |
toExternalForm() | |
toString() | |