您的位置:首页 > 理论基础 > 计算机网络

黑马程序员——java基础--网络编程

2015-05-17 08:08 423 查看
------<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(!
d65b
(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

equals(Object obj) 
          比较此 URL 是否等于另一个对象。

 String

getAuthority() 
          获取此 URL 的授权部分。

 Object

getContent() 
          获取此 URL 的内容。

 Object

getContent(Class[] classes) 
          获取此 URL 的内容。

 int

getDefaultPort() 
          获取与此 URL 关联协议的默认端口号。

 String

getFile() 
          获取此 URL 的文件名。

 String

getHost() 
          获取此 URL 的主机名(如果适用)。

 String

getPath() 
          获取此 URL 的路径部分。

 int

getPort() 
          获取此 URL 的端口号。

 String

getProtocol() 
          获取此 URL 的协议名称。

 String

getQuery() 
          获取此 URL 的查询部分。

 String

getRef() 
          获取此 URL 的锚点(也称为“引用”)。

 String

getUserInfo() 
          获取此 URL 的 userInfo 部分。

 int

hashCode() 
          创建一个适合哈希表索引的整数。

 URLConnection

openConnection() 
          返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。

 URLConnection

openConnection(Proxy proxy) 
          与 openConnection() 类似,所不同是连接通过指定的代理建立;不支持代理方式的协议处理程序将忽略该代理参数并建立正常的连接。

 InputStream

openStream() 
          打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。

 boolean

sameFile(URL other) 
          比较两个 URL,不包括片段部分。

protected  void

set(String protocol, String host, int port, String file, String ref) 
          设置 URL 的字段。

protected  void

set(String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref) 
          设置 URL 的指定的 8 个字段。

static void

setURLStreamHandlerFactory(URLStreamHandlerFactory fac) 
          设置应用程序的 URLStreamHandlerFactory。

 String

toExternalForm() 
          构造此 URL 的字符串表示形式。

 String

toString() 
          构造此 URL 的字符串表示形式。

 URI

toURI() 
          返回与此 URL 等效的 URI。

 

 

 

 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java