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

java--网络编程

2014-04-03 17:18 274 查看
IP地址:

网络中设备的标识

不可记忆,可用主机名

本地回环地址:127.0.0.1,主机名:localhost

InetAddress类

此类表示互联网协议 (IP) 地址。

IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的。

static InetAddress[] getAllByName(String host) 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。

static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址

String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。

String getHostName() 获取此 IP 地址的主机名。

static InetAddress getLocalHost() 返回本地主机。

String toString() 将此 IP 地址转换为 String。

import java.net.*;
public class Test
{
public static void main(String[] args) throws UnknownHostException
{
InetAddress i=InetAddress.getLocalHost();
System.out.println("toSting:"+i.toString());
System.out.println("HostAddress:"+i.getHostAddress());
System.out.println("HostName:"+i.getHostName());
System.out.println("-----------------");
InetAddress ia=InetAddress.getByName("www.baidu.com");
System.out.println("Address:"+ia.getHostAddress());
System.out.println("Name:"+ia.getHostName());
System.out.println("-----------------");//一个主机名对应多个IP地址
InetAddress[] ib=InetAddress.getAllByName("www.baidu.com");
for(InetAddress add : ib)
{
System.out.println("Address:"+add.getHostAddress());
}
}
}
结果:

toSting:chen-PC/192.168.0.121

HostAddress:192.168.0.121

HostName:chen-PC

-----------------

Address:115.239.210.27

Name:www.baidu.com

-----------------

Address:115.239.210.27

Address:115.239.210.26

端口号:

用于标识进程的逻辑地址,不同进程的标识

有效端口:0~65535,其中0~1024系统使用或保留端口

传输协议:

通讯的规则,常见协议:TCP和UDP。

UDP

面向无连接的,将数据及源和目的地封装成数据包,不需要建立连接。

每个数据包的大小限制在64K内

因无连接,是不可靠协议

不需要建立连接,速度快

Socket

是为网络服务的一种机制,通信的两端都是Socket,网络通信其实就是Socket间的通信。数据在两个Socket间通过IO传输。

/*
编写一个聊天程序。
有收数据的部分,和发数据的部分。
这两部分需要同时执行。
那就需要用到多线程技术。
一个线程控制收,一个线程控制发。
因为收和发动作是不一致的,所以要定义两个run方法。
而且这两个方法要封装到不同的类中。
*/
import java.io.*;
import java.net.*;
class Send implements Runnable
{
private DatagramSocket ds;
public 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)
{
byte[] buf = line.getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.121"),10002);
ds.send(dp);
if("886".equals(line))
break;
}
}
catch (Exception e)
{
throw new RuntimeException("发送端失败");
}
}
}
class Rece implements Runnable
{
private DatagramSocket ds;
public Rece(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 ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());

if("886".equals(data))
{
System.out.println(ip+"....离开聊天室");
break;
}
System.out.println(ip+":"+data);
}
}
catch (Exception e)
{
throw new RuntimeException("接收端失败");
}
}
}
class  Test34
{
public static void main(String[] args) throws Exception
{
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(10002);

new Thread(new Send(sendSocket)).start();
new Thread(new Rece(receSocket)).start();
}
}
TCP

建立连接,形成传输数据的通道

在连接中进行大数据量传输

进行三次握手完成,是可靠协议

必须建立连接,效率会稍低

TCP分客户端和服务端。

1、客户端对应的对象是Socket。

通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。

因为tcp是面向连接的。所以在建立socket服务时,就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。

2、服务端对应的对象是ServerSocket。

/*
需求:给服务端发送给一个文本数据。
客户端步骤:
1,创建Socket服务。并指定要连接的主机和端口。
*/
import java.io.*;
import java.net.*;
class  TcpClient
{
public static void main(String[] args) throws Exception
{
//创建客户端的socket服务。指定目的主机和端口
Socket s = new Socket("192.168.1.254",10003);
//为了发送数据,应该获取socket流中的输出流。
OutputStream out = s.getOutputStream();
out.write("tcp ge men lai le ".getBytes());
s.close();
}
}
/*
需求:定义端点接收数据并打印在控制台上。
服务端步骤:
1,建立服务端的socket服务。ServerSocket();
并监听一个端口。
2,获取连接过来的客户端对象。
通过ServerSokcet的 accept方法。没有连接就会等,所以这个方法阻塞式的。
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。
并打印在控制台。
4,关闭服务端。(可选)
*/
class  TcpServer
{
public static void main(String[] args) throws Exception
{
//建立服务端socket服务。并监听一个端口。
ServerSocket ss = new ServerSocket(10003);
//通过accept方法获取连接过来的客户端对象。
while(true)
{
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+".....connected");
//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();//关闭客户端.
}
//ss.close();
}
}
tcp的传输的客户端和服务端的互访。

class TcpClient2
{
public static void main(String[] args)throws Exception
{
Socket s = new Socket("192.168.1.254",10004);
OutputStream out = s.getOutputStream();
out.write("服务端,你好".getBytes());
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 TcpServer2
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10004);
Socket s = ss.accept();//阻塞式方法。
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);//阻塞式方法。
System.out.println(new String(buf,0,len));
OutputStream out = s.getOutputStream();
Thread.sleep(10000);
out.write("哥们收到,你也好".getBytes());
s.close();
ss.close();
}
}
建立一个文本转换服务器(小写转大写):

class Client
{
public static void main(String[] args) throws Exception
{
Socket s=new Socket("192.168.0.121",10004);
BufferedReader bufin=new BufferedReader(new InputStreamReader(System.in));

BufferedWriter out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
//PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String str=null;
while((str=bufin.readLine())!=null)
{
if(str.equals("over"))
break;
out.write(str);
out.newLine();
out.flush();
//out.println(line);
System.out.println("收到:"+in.readLine());
}
s.close();bufin.close();
}
}
class Server
{
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(10004);
Socket s=ss.accept();
System.out.println("与"+s.getInetAddress()+"已连接");

BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String str=null;
while((str=in.readLine())!=null)
{
System.out.println("收到:"+str);
out.write(str.toUpperCase());
out.newLine();
out.flush();
//out.println(line);
}
s.close();
ss.close();
}
}
s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1.

上传图片:

class  PicClient
{
public static void main(String[] args)throws Exception
{
Socket s = new Socket("192.168.1.254",10007);
FileInputStream fis = new FileInputStream("c:\\1.bmp");
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[] bufIn = new byte[1024];
int num = in.read(bufIn);
System.out.println(new String(bufIn,0,num));
fis.close();
s.close();
}
}
class  PicServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10007);
Socket s = ss.accept();
InputStream in = s.getInputStream();
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();
ss.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: