java 网络编程学习笔记一

一.什么是TCP?什么是UDP?
tcp和udp是两种网络信息传输协议,都能够进行网络通信,可以选择其中的一种。TCP最重要的特点是面向连接,也就是说必须在服务器端和客户端连接上之后才能
通信,它的安全性比较高。udp编程是面向非连接的,udp是数据报,只负责传输信息,并不能保证信息一定会被收到,虽然安全性不如TCP,但是性能较好;tcp基于连接,
udp基于报文。
二.客户端和服务器
客户端(Client)/服务器(Server)是一种最常见的网络应用程序的运行模式,简称C/S。
以网络聊天软件为例,在聊天程序中,各个聊天的界面叫做客户端,客户端之间如果要相互聊天,则可以将信息先发送到服务器端,然后由服务器端转发。因此客户端先要连接到
服务器端。
客户端连接到服务器端,需要知道一些什么信息呢?
显然,首先需要知道服务器的ip地址,还要知道服务器端该程序的端口。如,知道服务器Ip地址是127.0.0.1,端口是9999等。
因此,服务器必须首先打开这个端口,等待客户端的连接,俗称打开并监听某个端口。
在客户端,必须要做到以下工作:根据服务器IP,连接服务器的某个端口。
三.用客户端连接到服务器
案例介绍
客户端连接服务器端,首先要知道服务器端的ip地址,还要知道服务器端该程序的端口。
服务器必须首先打开这个端口,等待客户端的连接。客户端根据服务器Ip,连接到服务器的某个端口。本例中,服务器为本机,打开监听的端口为9999.
1.服务器端怎样打开并监听端口?
端口的监听是由java.net.ServerSocket进行管理的。这个类有很多构造函数,最常见的构造函数为:
public ServerSocket(int port) throws IOException 传入一个端口号,实例化ServerSocket
注意:实例化ServerSocket,就已经打开了端口号并进行监听。
例如,如下代码就可以监听服务器上的9999端口,并返回ServerSocket对象ss。
ServerSocket ss = new ServerSocket(9999);
2.客户端怎么样连接都服务器端的某个端口?
客户端连接到服务器端的某个端口是由java.net.Socket进行管理的,打开java.net.Socket的文档,这个类有很多构造函数,最常见的构造函数为:
public Socket(String host,int port) throws UnknownHostException,IOException
传入一个服务器IP地址和端口号,实例化Socket。
注意:实例化Socket,就已经请求连接到该IP地址对应的服务器
例如,如下代码就可以连接到服务器218.197.118.80上的9999端口,并返回连接Socket对象socket
Socket socket = new Socket("218.197.118.80",9999);
3.服务器怎么知道客户端连上来了?
既然客户端用Socket来向服务器请求连接,如果连接上之后,Socket对象自然成为连接的纽带。对于服务器来说,就应该得到客户端的这个Socket对象,并以此为基础来进行通信。
怎样得到客户端的Socket对象?在前面的篇幅中我们知道,服务器端实例化SocketServer对象,监听端口。打开ServerSocket文档,会发现里面一个重要函数:
public Socket accept() throws IOException
该函数返回一个Socket对象,因此,在服务器可以用如下代码得到客户端的Socket对象:
Socket socket = ss.accept();
注意:值得注意的是accept函数是一个"死等函数",如果没有客户端请求连接,它会一直等待并阻塞程序。为了说明这个问题,编写如下代码进行测试:
AcceptTest.java
import java.net.ServerSocket;
import java.net.Socket;
public class AcceptTest
{
 public static void main(String[] args) throws Exception
 {
  //监听9999端口
  ServerSocket ss = new ServerSocket(9999);
  System.out.println("未连接");
  //等待客户端连接,如果没有客户端连接,程序在这里阻塞
  Socket socket = ss.accept();
  System.out.println("连接");
 }
}
运行这个程序,纸打印出 “未连接 ”,没有打印“连接”,说明程序在accept处阻塞。当然,如果此时有另外一个客户端进行连接,阻塞就可以解除。
AcceptTest_Client.java
import java.net.Socket;
public class AcceptTest_Client
{
 public static void main(String[] args) throws Exception
 {
  Socket socket = new Socket("127.0.0.1",9999);
 }
}
运行客户端,服务器打印出"连接"。说明服务器阻塞被解除。
4.如何从Socket得到一些连接的基本信息?
了解了客户端怎么样连接到服务器,很显然,客户端和服务器端用Socket对象来进行通信。那么,从Socket能否得到一些连接的基本信息呢?
public InetAddress getInetAddress()
返回Socket内连接客户端的地址。
该返回类型是java.net.InetAddress,查找java.net.InetAddress文档,可以用以下方法得到IP地址:
public String getHostAddress()
返回IP地址字符串(以文本形式)

完整程序如下:
Server.java
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JFrame;
public class Server extends JFrame
{
 private ServerSocket ss;
 private Socket socket;
 public Server()
 {
  super("服务器端,目前未见连接");
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  this.setSize(300,100);
  this.setVisible(true);
  try
  {
   ss=new ServerSocket(9999);
   socket = ss.accept();
   String clientAddress = socket.getInetAddress().getHostAddress();
   this.setTitle("客户"+clientAddress+" 连接");
  }catch(Exception ex)
  {
   ex.printStackTrace();
  }
  
 }
 public static void main(String[] args)
 {
  new Server();
 }
}
客户端:Client.java
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Client extends JFrame implements ActionListener
{
 private JButton btConnet = new JButton("连接");
 private Socket socket;
 public Client()
 {
  super("客户端");
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  this.add(btConnet,BorderLayout.NORTH);
  btConnet.addActionListener(this);
  this.setSize(300,100);
  this.setVisible(true);
 }
 public void actionPerformed(ActionEvent e)
 {
  try
  {
   socket = new Socket("127.0.0.1",9999);
   this.setTitle("恭喜你,已经连接上");
  }catch(Exception ex)
  {
   ex.printStackTrace();
  }
 }
 public static void main(String[] args)
 {
  new Client();
 }
}

 

你可能感兴趣的:(java 网络编程学习笔记一)