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

Java通信之Socket网络编程

2014-12-23 18:04 477 查看
通信协议

通信规则,包含TCP和UDP协议,其中TCP是面向连接的协议,UDP是无连接的协议

相关知识点总结:

ip:

网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP地址具有唯一性,根据用户性质的不同,可以分为5类。

端口(port):是计算机与外界通讯交流的出口

UDP传输

发送数据:

a、建立UDPSocket服务,在此无需指定端口,也可以将端口加入。如果不指定的话,系统会随机分配一个端口,如第一次运行时端口为1093,那么第二次就会顺延为1094,再运行会一直顺延,因为之前的端口还没有得到释放,所以会顺延端口号值。

b、提供数据,并将数据封装到数据包中

c、通过socket服务的发送功能,将数据包发送出去

d、关闭资源

2)接收数据:

a、定义UDPSocket服务。通常会监听一个端口,其实就是给这个接收网路应用程序定义数字标识,方便于明确哪些数据过来该应用程序可以处理。

b、定义一个数据包,用来存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。

c、通过socket服务的receive方法接收到的数据存入已定义好的数据包中

d、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上

e、关闭资源

在定义接收数据的方法中,仍会在DatagramSocket构造函数中传入DatagramPacket的参数,这是因为收到的数据太多,需要解析,通过将数据封装成对象,易于解析,所以需要传入参数。

注意:

1、发送端与接收端是两个独立的运行程序。

2、在发送端,要在数据包对象中明确目的地IP及端口。

3、在接收端,要指定监听的端口。

package com.net;

import java.io.*;
import java.net.*;

class UdpS implements Runnable{
private DatagramSocket ds;
UdpS(DatagramSocket ds){
this.ds = ds;
}
@Override
public void run() {
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
DatagramPacket dp= null;
while((line= br.readLine())!= null){
byte[] buf = line.getBytes();
dp = new DatagramPacket(buf,
buf.length,
InetAddress.getByName("127.0.0.1"),
10000
);
ds.send(dp);
}
}
catch(Exception e){
throw new RuntimeException("读写失败!");
}
}

}
class UdpR implements Runnable{
private DatagramSocket ds = null;
UdpR(DatagramSocket ds){
this.ds = ds;
}
@Override
public void run() {
try{
byte[] buf = new byte[1024];
DatagramPacket dp = null;
while(true){
dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
int port = dp.getPort();
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+port+"接受的数据时:"+data);
}
}catch(Exception e ){
throw new RuntimeException("接受数据失败!");
}
}

}

public class UdpChat{

public static void main(String[] args) throws Exception {
new Thread(new UdpS(new DatagramSocket())).start();
new Thread(new UdpR(new DatagramSocket(10000))).start();
}

}


TCP传输


TCP分客户端和服务端。客户端对应的对象是Socket,服务端对应的对象是ServerSocket。

方法:

创建客户端对象:

Socket():创建空参数的客户端对象,一般用于服务端接收数据

Socket(String host,int port),指定要接收的IP地址和端口号

2)创建服务端对象:ServerSocket(int port):指定接收的客户端的端口

3)Socket accept():监听并接受到此套接字的连接

4)void shutdownInput():此套接字的输入流至于“流的末尾”

5)void shutdownOutput():禁用此套接字的输出流

6)InputStream getInputStream():返回此套接字的输入流,Socket对象调用

7)OutputStream getOutputStream():返回套接字的输出流,Socket对象调用

//客户端
class  TcpClient
{
public static void main(String[] args) throws Exception
{
//创建Socket服务
Socket s=new Socket("127.0.0.1",10000);

//定义读取流读取文件数据
BufferedReader br=new BufferedReader(new FileReader("TcpDemo.java"));

//定义目的,将数据写入到Socket输出流。发给服务端
//BufferedWriter bwout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);

//定义一个Socket读取流,读取服务端返回信息。
BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));

String line=null;
while ((line=br.readLine())!=null)
{
pw.println(line);
}

s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1.

System.out.println(brin.readLine());//接收返回信息

br.close();
s.close();
}
}

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

//获取客户端连接
Socket s=ss.accept();

//获取客户端ip
System.out.println(s.getInetAddress().getHostName()+" connected.......");

//读取Socket读取流中的数据
BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));

//将接收到的数据写入文件中
PrintWriter out=new PrintWriter(new FileWriter("TcpDemo.txt"),true);

//将返回信息写入Socket流的写入流中
BufferedWriter bwout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

String line=null;
while ((line=brin.readLine())!=null)
{
out.println(line);
}

//PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
//pw.println("上传成功");

bwout.write("上传成功!");
bwout.newLine();//换行
bwout.flush();//刷新

out.close();//关流
s.close();
ss.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: