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

黑马程序员------Java基础-----网络编程

2015-09-03 11:14 656 查看

黑马程序员——Java基础—–网络编程

——- android培训java培训、期待与您交流! ———-

1、IP地址

在互联网上每一台计算机都有唯一的表示自己的标记,这个标记就是IP地址,IP地址是使用32位长度的二进制数据表示如:192.168.1.103。

2.TCP协议和UDP协议的区别

TCP协议面向连接的,而UDP协议时面向非连接的。TCP协议时可靠的传输协议,在传输数据时不会丢失数据。而UDP协议时不可靠的传输协议,在传输数据的过程中容易丢失数据。所以TCP协议传输数据的速度没有UDP协议的速度快

3、InetAddress类

intentAddress类主要是表示Ip地址的中有以下的常用方法:

getByName():通过主机名得到InetAddress对象

getLocalHost():通过本机得到InetAddress对象

getHostName():得到IP地址

isReachable():判断地址是否可以到达,同时指定超时时间

4、TCP程序设计

在java中使用Socket来完成TCP程序开发,使用此类可以方便地建立可靠的,双向的、持续的、点对点的通信连接。

在服务器端用到是ServerSocket类,用于接受客户端地请求。在服务器端每次运行时都要使用accept()方法等待客户端的连接,此方法执行之后服务器端将进入阻塞状态,直到客户端连接之后程序才能继续向下执行。

在客户端,程序可以通过Socket类地getInputStream()方法取得服务器的输出信息,在服务器端可以通过getOutputStream()方法取得客户端地输出信息。

示例:

/*
需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。
*/
//客户端
import java.net.*;
import java.io.*;
class  TcpClient
{
public static void main(String[] args) throws Exception
{
//1、创建客户端的Socket服务。指定目的主机和端口
Socket s=new Socket("127.0.0.1",10000);
//2、获取Socket流中输出流,发送数据
OutputStream out=s.getOutputStream();
out.write("你好!".getBytes());
//3、获取Socket流中的输入流,用来接收服务端的反馈信息并打印
InputStream in=s.getInputStream();

byte[] buf=new byte[1024];
int len=in.read(buf);//读取反馈的数据

//输出接收的数据
System.out.println(new String(buf,0,len));

s.close();//关闭资源
}
}

//服务端

class TcpServer
{
public static void main(String[] args)throws Exception
{
//1、创建服务端的Socket服务,并监听一个端口
ServerSocket ss=new ServerSocket(10000);
//2、通过accept方法获取连接过来的客户端对象。
Socket s=ss.accept();
//获取客户端ip
String ip=s.getInetAddress().getHostName();
System.out.println(ip+"connected....");
//3、获取对应客户端对象的读取流读取发过来的数据,并打印
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));

//4、调用对应的客户端的输出流写入返回数据
OutputStream out=s.getOutputStream();
out.write("哥们,收到!".getBytes());

//关闭资源
s.close();
ss.close();//可选操作
}
}


5、UDP程序设计

使用UDP发送数据的数据,对方不一定能接收到。所有的信息使用数据报的形式发送出去,所以这就要求客服端要始终保持着等待接受服务器端发过来的数据,在Java中使用DatagramSocket类和DatargramPacket类来完成程序的开发。

DatagramSocket类来完数据发生的操作,DatagramPacket类来完成数据的包装。

/*
udp发送端:
需求:通过udp传输方式,将一段文字数据发送出去。
*/

import java.net.*;
class UdpSend
{
public static void main(String[] args)throws Exception
{
//1、创建udp服务。通过DatagramSocket对象
DatagramSocket ds=new DatagramSocket();
//2、确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)
byte[] buf="udp shi shen ma".getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.175"),10000);

//3、通过Socket服务,将已有的数据包发送出去。通过send方法。
ds.send(dp);
//4、关闭资源
ds.close();
}
}

/*
udp接收端
需求:定义一个应用程序,用于接收udp协议传输的数据并处理。
*/

class UdpReceive
{
public static void main(String[] args)throws Exception
{
//1、创建udp Socket服务,建立端点
//DatagramSocket ds=new DatagramSocket(10000);

//一直处于接收状态
while(true)
{
//1、创建udp Socket服务,建立端点
DatagramSocket ds=new DatagramSocket(10000);
//2、定义数据包。用于存储数据
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//3、通过Socket服务的receive方法将接收到的数据存入数据包中
ds.receive(dp);//阻塞式方法
//4、通过数据包的方法获取其中的数据
String ip=dp.getAddress().getHostName();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
System.out.println(ip+"::"+data+"::"+port);
//5、关闭资源
ds.close();
}
//5、关闭资源
//ds.close();
}
}


下面是学习过程中,做过的几个小练习:

练习一:

/*
需求:并发上传图片
*/

import java.io.*;
import java.net.*;
//客户端
class  PicClient
{
public static void main(String[] args) throws Exception
{
//对传入的值进行判断
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("localhost",10000);
//读取图片数据
FileInputStream fis=new FileInputStream(file);

//用Socket服务输出流写入数据
OutputStream out =s.getOutputStream();

BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));

byte[] buf=new byte[1024];

int len=0;

while ((len=fis.read(buf))!=-1)
{
out.write(buf,0,len);
}

//结束标记,表示文件数据已经上传完了
s.shutdownOutput();

String info=in.readLine();//读取返回信息
System.out.println(info);

fis.close();//关流
s.close();

}
}

//服务端
class PicServer
{
public static void main(String[] args)throws Exception
{
//创建服务,监听端口
ServerSocket ss=new ServerSocket(10000);

while (true)
{
//获取客户端对象
Socket s=ss.accept();
//客户端执行线程
new Thread(new PicThread(s)).start();
}

//ss.close();
}
}

//利用多线程实现并发上传
class PicThread implements Runnable
{
private Socket s;
PicThread(Socket s)
{
this.s=s;
}
public void run()
{
int count=1;
//获取客户端ip
String ip=s.getInetAddress().getHostAddress();
try
{
System.out.println(ip+"  connected.....");

//通过客户端的读取流读取数据
InputStream in=s.getInputStream();
//文件保存路径
File dir =new File("C:\\Users\\asus\\Desktop");
//文件名
File file=new File(dir,ip+".jpg");
//判断文件是否存在
while(file.exists())
{
file=new File(dir,ip+"("+(count++)+").jpg");
}

//将数据写入到指定文件中
FileOutputStream fos=new FileOutputStream(file);

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 (Exception e)
{
throw new RuntimeException(ip+"图片上传失败");
}
}
}


练习二:

import java.io.*;
import java.net.*;
//客户端
class  LoginClient
{
public static void main(String[] args) throws Exception
{
//创建服务
Socket s=new Socket("localhost",10000);
//键盘录入
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

//用Socket服务输出流写入数据
PrintWriter out =new PrintWriter(s.getOutputStream(),true );

//接收服务器返回的信息
BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));

String line=null;

for(int x=0;x<3;x++)
{
line=br.readLine();//读取键盘录入
if (line==null)
{
break;//如果键盘没有输入,则直接结束
}

out.println(line);//将数据写入流中

String info=in.readLine();//读取返回信息

System.out.println(info);

if (info.contains("欢迎"))//---------------
{
break;//如果登录成功,就跳出循环
}
}

br.close();//关流
s.close();
}
}

//服务端
class LoginServer
{
public static void main(String [] args)throws Exception
{
//创建服务,监听端口
ServerSocket ss=new ServerSocket(10000);

while (true)
{
//获取客户端对象
Socket s=ss.accept();

//客户端执行线程
new Thread(new LoginThread(s)).start();
}
c511

//ss.close();
}
}

//利用多线程实现并发登录
class LoginThread implements Runnable
{
private Socket s;
LoginThread(Socket s)
{
this.s=s;
}
public void run()
{
//获取客户端ip
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"  connected.....");
try
{
for (int x=0;x<3 ;x++ )
{
//通过客户端的读取流读取数据
BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));

//读取数据库中的数据,这里用文件来表示数据库
BufferedReader br=new BufferedReader(new FileReader("users.txt"));

String line=in.readLine();//读取客户端数据
if (line==null)//--------------
{
break;//如果客户端没有发送数据,则跳出循环
}
String data=null;
boolean flag=false;//设置标记
//读取数据库中的用户数据
while ((data=br.readLine())!=null)
{
if (line.equals(data))
{
flag=true;//如果用户存在,则将标记设为true
break;
}
}

//将数据写入到指定文件中
PrintWriter out=new PrintWriter(s.getOutputStream(),true);

if (flag)
{
System.out.println(line+",已登陆!");

out.println(line+",欢迎光临!");

break;//-----------
}
else
{
System.out.println(line+",尝试登陆!");
out.println(line+",用户名不存在!");
}
}
s.close();//关流
}
catch (Exception e)
{
throw new RuntimeException("用户登陆失败");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息