嘿牛程序员__成都传智博客__网络编程(上)

来源:互联网 发布:淘宝怎么阻止买家下单 编辑:程序博客网 时间:2024/05/17 00:18

---------------------- android培训、java培训、期待与您交流! ----------------------


微笑本节研究网络编程的内容
网络编程主要分为两类:UDP TCP
前者是无连接通信协议。简单的来说就如传呼机一样,你给用户发了信息,但对方是否收到信息你无法确认。
后者是面向连接的通信协议。简单的来说就犹如你在打电话,你能听到对方的声音,而对方也能听到你的声音。
我们主要研究的是面向连接的通信协议。java提供了相应的编程类,即ServerSocket,用于服务器端,Socket用于客户端。
下面我们举例说明,要求实现传入字节,然后反向输出:

/**
  * 程序1
  *该程序是服务端程序
  *该程序实现传入字节,然后反向输出
  *
  **/
import java.net.*;
import java.io.*;
class Servicer implements Runnable
{
 Socket s;
 public Servicer(Socket s)
 {
  this.s = s;
 }
 public void run()//实现抽象方法
 {
 try
 {
 InputStream ips=s.getInputStream();
 OutputStream ops=s.getOutputStream();
 
 BufferedReader br = new BufferedReader(new InputStreamReader(ips));//将字节转化成字符串,储存在缓冲区中
 DataOutputStream dos = new DataOutputStream(ops);//新建数据输出流
 while(true)
   {
  String strWord = br.readLine();//以字符串读取数据
  //System.out.println(strWord +":" + strWord.length());
  if(strWord. equalsIgnoreCase("quit"))//判断是否停止
   break;
  String strEcho = (new StringBuffer(strWord).reverse()).toString();//将输入的数据反向
  //dos.writeBytes(strWord +"---->"+ strEcho +"\r\n");
  //System.getProperty("line.separator"  平台独立的换行符。在这个平台下行与行之间的分隔符,相当于“\n”

  dos.writeBytes(strWord + "---->"+ strEcho +System.getProperty("line.separator"));//写入数据 
  //dos.writeBytes(strWord + "---->"+ strEcho);//写入数据   
   }
 br.close();
 //关闭包装类,会自动关闭包装类中所包装的底层类。所以不用调用ips.close()
 dos.close();
 s.close();
 }catch(Exception e){e.printStackTrace();}
 }
}
class TcpServer
{
 public static void main(String [] args)
 {
  try
  {
   //public class ServerSocket extends Object此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
   //public class Socketextends Object此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
   
   ServerSocket ss=new ServerSocket(8001);//定义端口,8000、8001为通用接口
   //ServerSocket ss=new ServerSocket(0);//获取当前接口
   //int i=ss.getLocalPort();
   //public int getLocalPort()返回此套接字在其上侦听的端口。
   System.out.println("sever 正在运行;"+"端口号为:"+ss.getLocalPort());
   while(true)
   {
    //public Socket accept() throws IOException侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
    Socket s=ss.accept();
    new Thread(new Servicer(s)).start();//实现多线程
   }
   //ss.close();
  }catch(Exception e){e.printStackTrace();}
 }
}

//总结:端口
/*1、一般情况下,使用8000或8001
 ServerSocket ss=new ServerSocket(8000);
  ServerSocket ss=new ServerSocket(8001);
2、如果利用netstat -an 可以查看实际开放端口(本地地址:0.0.0.0:?  ?即为开放端口)
3、可以用以下语句,获得当前端口
            ServerSocket ss=new ServerSocket(0);
   //int i=ss.getLocalPort();
   System.out.println("sever 正在运行"+ss.getLocalPort());
   
使用telnet 客户端程序
如果是在WIN7环境下,要先打开telnet,方法为“控制面板”-->“程序”-->“打开或关闭windows功能”
使用时可以在cmd 下输入telnet 或直接打开,位置在:C:\Windows\System32\
方法命令:
open IP地址 端口号
如 open 211.83.249.7 8001
   
*/

/**
 *程序1
 *该程序是客户端程序
 *该程序实现传入字节,然后反向输出
 *
 **/
 
import java.net.*;
import java.io.*;
public class TcpClient
{
 public static void main(String [] args)
 {
 try
 {
  //Socket s=new Socket(InetAddress.getByName("192.168.0.213"),8001);//绑定本地的ip地址和端口号
  if(args.length < 2)
  {
   System.out.println("Usage:java TcpClient ServerIP ServerPort");
   return;
  }
  //public class Socket extends Object此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
  //public Socket(InetAddress address, int port)throws IOException创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
  //public class InetAddress extends Objectimplements Serializable此类表示互联网协议 (IP) 地址。
        //public static InetAddress getByName(String host) throws UnknownHostException在给定主机名的情况下确定主机的 IP 地址。 主机名可以是机器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式。如果提供字面值 IP 地址,则仅检查地址格式的有效性。
  //public static int parseInt(String s) throws NumberFormatException将字符串参数作为有符号的十进制整数进行解析。除了第一个字符可以是用来表示负值的 ASCII 减号 '-' ('\u002D') 外,字符串中的字符都必须是十进制数字。返回得到的整数值,就好像将该参数和基数 10 作为参数赋予 parseInt(java.lang.String, int) 方法一样。参数:

  Socket s=new Socket(InetAddress.getByName(args[0]),Integer.parseInt(args[1]));
  InputStream ips=s.getInputStream();
  OutputStream ops=s.getOutputStream();
  
  //InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
  //public class DataOutputStreamextends FilterOutputStreamimplements DataOutput数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
  //public class BufferedReaderextends Reader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
  BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));
  DataOutputStream dos = new DataOutputStream(ops);
  BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));

  while(true)
  {
   String strWord = brKey.readLine();
    //public final void writeBytes(String s) throws IOException 将字符串按字节顺序写出到基础输出流中。按顺序写出字符串中每个字符,丢弃其八个高位。如果没有抛出异常,则计数器 written 增加 s 的长度。
   //经过下面步骤(writeBytes),以字节形式传递给server:TecServer.java:InputStream ips=s.getInputStream();
   //System.getProperty("line.separator"  平台独立的换行符。在这个平台下行与行之间的分隔符,相当于“\n”.如果没有它,程序会因无法判定一次输入何时结束而执行不下去
   //用一个字符串去存储 String space = System.getProperty("line.separator");

   dos.writeBytes(strWord + System.getProperty("line.separator"));
    //dos.writeBytes(strWord);
   //public boolean equalsIgnoreCase(String anotherString)将此 String 与另一个 String 比较,不考虑大小写。如果两个字符串的长度相同,并且其中的相应字符都相等(忽略大小写),则认为这两个字符串是相等的。
   if(strWord.equalsIgnoreCase("quit"))
    break;
   else
       //下面语句的作用是从sever 返回数据,由TcpClient.java:InputStream ips=s.getInputStream();接收,然后输出。
    System.out.println("反向显示"+brNet.readLine());
        
  }
  dos.close();
  brNet.close();
  brKey.close();
  s.close();
 }catch(Exception e){e.printStackTrace();}
 }
}

再见

---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima

原创粉丝点击