网络编程
1.网络基础
局域网 城域网 广域网
2.网络通信的要素
IP地址和端口号
java.net.InetAddress 这个类代表一个互联网协议(IP)地址。
3.InetAddress类
没有构造方法 --> public static InetAddress getLocalHost()
getHostName()
获取此IP地址的主机名
getHostAddress()
返回文本表示中的IP地址字符串。
4. TCP 和 UDP
java.net Class Socket 客户端套接字
java.net Class ServerSocket服务器套接字
java.net Class DatagramSocket 发送和接收数据包
java.net Class DatagramPacket 这类表示一个数据报包
第一个例子模拟服务器和客户端的连接
public class LoginServer { public static void main(String[] args) { //建立服务器socket,端口号给9999; ServerSocket serverSocket=null; try { serverSocket=new ServerSocket(9999); //等待用户进行通信 Socket socket=serverSocket.accept(); //创建输入,输出流 InputStream is=socket.getInputStream(); OutputStream os=socket.getOutputStream(); //缓存 BufferedReader br=new BufferedReader(new InputStreamReader(is)); String info =null; if((info=br.readLine())!=null){ System.out.println("我是服务器,客户端发送的信息为:"+info); } String reply="我是服务器,恭喜你连接到服务器了"; os.write(reply.getBytes()); br.close(); os.close(); is.close(); } catch (IOException e) { e.printStackTrace(); }finally { if(serverSocket!=null) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); }}}}
public class LoginClient { public static void main(String[] args) { Socket socket=null; try { socket=new Socket("localhost",9999); InputStream is =socket.getInputStream(); OutputStream os =socket.getOutputStream(); String info="我是客户端,我的用户名是wwh,密码admin"; os.write(info.getBytes()); socket.shutdownOutput(); String reply=null; BufferedReader br=new BufferedReader(new InputStreamReader(is)); if((reply=br.readLine())!=null){ System.out.println("我是客户端,服务器的响应为"+reply); } br.close(); os.close(); is.close(); } catch (IOException e) { e.printStackTrace(); }finally { if(socket!=null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); }}}}}
总结:先去运行服务端类,服务端创建服务端的对象,也就是ServerSocket,并且要在这里把端口号给了,然后创建Socket对象,并且让服务器对象等待accept。然后创建socket的输出和输入流get。服务器接受客户端发送的东西,用缓存------BufferedReader,然后就readline,输出接收的东西。当你接收到客户端的信息了,你要给出反馈信息的,定义reply,直接进行写入流,然后关流。
接下来是客户端了,首先你要和客服端的端口一致。创建输入和输出流。客户先给服务器发送消息,执行写入操作,必须用一个方法将写入关闭socket.shutdownOutput();否则无法得到想要的结果。同样的方法去接收服务器反馈的结果。然后关流。
第二个例子,两个客户端级别的连接
public class Receive { public static void main(String[] args) { //定义数据包 DatagramPacket dp=null; //接受和发送数据 DatagramSocket ds=null; //定义数据包 DatagramPacket dpno=null; byte[] bytes=new byte[1024]; try { //创建数据包套接字,绑定端口 ds=new DatagramSocket(9988); dp=new DatagramPacket(bytes, bytes.length); ds.receive(dp); String rece=new String(dp.getData(),0, dp.getLength()); System.out.println("他给你发消息是:"+rece); String reply="麻烦您等一下"; System.out.println("接收端回答:"+reply); //没有协议附件的套接字地址的对象 SocketAddress sa=dp.getSocketAddress(); dpno=new DatagramPacket(reply.getBytes(),reply.getBytes().length,sa); ds.send(dpno); ds.close(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}}
public class Send { public static void main(String[] args) { InetAddress ia = null; DatagramSocket socket = null; DatagramPacket dp=null; String msg="您好,我有一个问题要咨询"; System.out.println(msg); try { ia=InetAddress.getByName("localhost"); dp=new DatagramPacket(msg.getBytes(),msg.getBytes().length,ia,9988); socket=new DatagramSocket(); socket.send(dp); byte[] bytes=new byte[1024]; DatagramPacket dpno=new DatagramPacket(bytes, bytes.length); socket.receive(dpno); //这里的reply的回复,是接收Receive通过他的dpno来完成的数据包。 String reply=new String(dpno.getData(),0, dpno.getLength()); System.out.println(dpno.getAddress().getAddress()+"说"+reply); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}}