java网络通信——socket

最近闲来没事,在慕课网上看了socket网络编程,在此做些笔记,希望对感兴趣的同志有所帮助。


在java中对于网络的支持,它是根据不同的网络层次,java有不同的类的支持。

1.InetAddress:用于标识网络上硬件资源的(网络的ip)

2.URL:通过URL可以直接读取网络上的资源和直接把资源写入到网络上,组成(协议名称和资源名称,之间用冒号隔开)

3.Sockets:用TCP协议实现网络通信的socket相关的类

4.Datagram:udp协议,通过数据包进行网络同信


对于他们是否都具有构造方法呢?

InetAddress:没有构造方法,但是有静态方法

URL:有构造方法,可以通过openStream()方法获取指定资源的输入流

socket:有构造方法

ServerSocket:有构造方法

注意:我们知道在网络上有 client(客服端)和server(服务端)的说法,

对于client而言它的socket的类是socket,对于server的socket的类是ServerSocket,


socker和ServerSocket都是基于TCP协议实现的网络通信


以下是相应的列子:

1.InetAddress的列子:

public class Test01 {
public static void main(String[] args){
try {
InetAddress address=InetAddress.getLocalHost();
System.out.println("address"+address);
System.out.println("name:"+address.getHostName());
System.out.println("ip:"+address.getHostAddress());
byte[] bytes=address.getAddress();
System.out.println("byte ip:"+Arrays.toString(bytes));

//根据计算机名字来获取实例
InetAddress address2=InetAddress.getByName("ldypc");
System.out.println("name2:"+address2.getHostName());
System.out.println("ip2:"+address2.getHostAddress());

//根据ip地址来获取实例
InetAddress address3=InetAddress.getByName("10.13.7.13");
System.out.println("name3:"+address3.getHostName());
System.out.println("ip3:"+address3.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}


2.URL的列子:

package imooc;

import java.net.MalformedURLException;
import java.net.URL;

public class test02 {
public static void main(String[] args){
String url="http://www.imooc.com";
try {
URL imooc=new URL(url);
//?后面表示参数,#后面表示锚点
URL newUrl=new URL(imooc,"/index.html?username=tom#test");
System.out.println("协议:"+newUrl.getProtocol());
System.out.println("host:"+newUrl.getHost());
//如果没有指定端口,就是用默认的端口号,返回的就是-1
System.out.println("port:"+newUrl.getPort());
System.out.println("file path:"+newUrl.getPath());
System.out.println("file name:"+newUrl.getFile());
System.out.println("xiang dui path:"+newUrl.getRef());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}


3.URL获取资源:

package imooc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class Test03 {
public static void main(String[] args){
try {
URL imooc=new URL("http://www.baidu.com");
//通过url的Openstream方法获取指定对象的资源的字节输入流
InputStream is=imooc.openStream();
//把字节输入流转换为字符输入流
InputStreamReader isr=new InputStreamReader(is,"utf-8");
//把字符流添加到缓冲中
BufferedReader br=new BufferedReader(isr);
//一次读取一行
String data=br.readLine();
while(data!=null){
System.out.println(data);
data=br.readLine();
}
br.close();
isr.close();
is.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


4.一个TCP协议的列子,两个程序:一个是client(客服端),一个server(服务端):

client 的列子——Socket的用法:

package imooc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
public static void main(String[] args){
try {
//创建客户端socket,指定服务器地址和端口
Socket socket=new Socket("localhost",8888);
//获取输出流用来想服务器端发送信息
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("username:admin;password:123");
pw.flush();
socket.shutdownOutput();
//输入流
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String info=null;
while((info=br.readLine())!=null){
System.out.println("我是客服端,服务器说:"+info);
}
socket.shutdownInput();
br.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

server端的列子——ServerSocket的用法:

package imooc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
public static void main(String[] args){
try {
//创建一个服务器端socket(ServerSocket),指定绑定的端口并监听
ServerSocket serverSocket=new ServerSocket(8888);
//调用accept()方法开始监听,等待客户端连接
System.out.println("等待客户端连接");
int count=0;
while(true){                                                                                           //while()程序段是多线程接收客服端的请求
Socket socket=serverSocket.accept();
//创建一个新的线程
ServerThread serverThread=new ServerThread(socket);
//启动
serverThread.start();
count++;
System.out.println("count="+count);
InetAddress inetAddress=socket.getInetAddress();
System.out.println("ip:"+inetAddress.getHostAddress());
}

//获取输入流用来读取客户端的信息
/*                                                                        //这里注释的是单线程接收客服端的请求
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();
//获取输出流,响应客户端的请求
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("welcome");
pw.flush();

//关闭资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
*/
//serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


5.UDP协议的client和server:

client端的代码:

package imooc;


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UDPClient {
public static void main(String[] args){
//定义服务器的地址,端口号,数据
try {
InetAddress address=InetAddress.getByName("localhost");
int port=8888;
byte[] data="usernaem:admin;password:123".getBytes();
//创建数据包
DatagramPacket packet=new DatagramPacket(data,data.length, address,port);
//创建
DatagramSocket socket=new DatagramSocket();
//发送
socket.send(packet);

//datagrampacket
byte[] data2=new byte[1024];
DatagramPacket packet2=new DatagramPacket(data2, data2.length);
//接收
socket.receive(packet2);
//读取数据
String reply=new String (data2,0,packet2.getLength());
System.out.println("我是客户端,服务端说:"+reply);
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

server段的代码:

package imooc;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPServer {
public static void main(String[] args){
try {
//创建DatagramSocket,指定端口号
DatagramSocket socket=new DatagramSocket(8888);
//创建DatagramPacket
byte[] data=new byte[1024];
DatagramPacket packet=new DatagramPacket(data,data.length);
//接收客户端的信息
//此方法在接受数据前,处于阻塞
socket.receive(packet);
//读取数据
String info=new String (data,0,packet.getLength());
System.out.println("我是服务器,客户端说:"+info);
//定义client的地址,端口号,信息
InetAddress address=packet.getAddress();
int port=packet.getPort();
byte[] data2="welcome".getBytes();
//Datagrampacket
DatagramPacket packet2=new DatagramPacket(data2, data.length,address,port);
socket.send(packet2);
socket.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}



希望对你有所帮助,谢谢花时间阅读,写的不是很好,望能接受。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值