`
accpxudajian
  • 浏览: 452363 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于TCP的Socket编程

    博客分类:
  • Java
阅读更多

>>Socket相关的理解:
1>TCP:拨电话后和对方谈话 对应特点:有连接,安全(对方一定收到了且自己说什么对方听到的就是什么)。
     UDP:写信给对方 对应特点:无连接,但对方不一定收到,收到了数据也不一定完整。
     DNS:域名服务(每个域名对一个一个IP)。
2>比喻和对比
        Socket:电话机         IP:电话号码  端口:分机号。
3>返回本地IP地址的三种方式:
    InetAddress.getByName("localhost")   ; InetAddress.getByName("127.0.0.1") (属于回路地址)  ; InetAddress.getByName(null)   ;
4>服务器端和客户端的功能
    服务器端:开辟端口 提供服务;
   客户端:指定服务器端和端口,获取服务。

>>一个简单的客户端/服务器端(Client/Server)的数据读写
Server服务器端代码:
import java.net.*;
import java.io.*;
class ServerrSocket
{
public static void main(String[] args)
{
  server();
}
public static void server()
{
  try{
   ServerSocket ss = new ServerSocket(6000);//指定6000端口提供服务;
   System.out.println("服务器端启动...");
   Socket s = ss.accept();    //采取侦听的方法,随时接受客户端Client的请求
   OutputStream os = s.getOutputStream(); //根据客户端Client创建输出流对象
   InputStream is = s.getInputStream(); //根据客户端Client创建输入流对象
   os.write("hello ,welcome you!".getBytes()); //向客户端Client写入数据
   byte[] buf = new byte[100]; //声明一个byte数组,用于接收客户端Client的输入数据
   int len = is.read(buf); //读取客户端的输入Client数据并保存到byte数组中,返回数组大小
   System.out.println(new String(buf,0,len)); //服务器端Server输出客户端的输入
   os.close();//关闭输出流
   is.close(); //关闭输入流
   s.close(); //关闭Socket对象
   ss.close(); //关闭服务器Socket对象
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
}
}

客户端Client代码:
import java.net.*;
import java.io.*;
class ClientSocket
{
public static void main(String[] args)
{
  client();
}
public static void client()
{
  try{
   Socket s = new Socket(InetAddress.getByName("127.0.0.1"),6000); //创建指定IP的端口号为6000的服务请求
   OutputStream os = s.getOutputStream();  //根据服务器端Server创建输出流对象
   InputStream is = s.getInputStream(); //根据服务器端Server创建输入流对象
   os.write("hello ,i am dajian!".getBytes()); //向服务器度Server写入字节码数据
   byte[] buf = new byte[100]; //声明byte数组,用于接收服务器端的数据
   int len = is.read(buf);  //读入服务器度Server写入的数据到byte数组,返回数组大小
   System.out.println(new String(buf,0,len)); //客户端输出数据
   os.close(); //关闭输出流
   is.close(); //关闭输入流
   s.close();//关闭Socekt对象

  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
}
}

3>>与Thread结合,实现持续不间断的侦听客户端的请求
import java.net.*;
import java.io.*;
//服务器端继承Thread,变成线程类
class ServerrSocket  extends Thread

{
private Socket s; //套接字属性
//带参构造函数指定哪个为套接字提供服务
ServerrSocket(Socket s)
{
  this.s = s;
}

//重写run方法
public void run()
{  
  try{
   OutputStream os = s.getOutputStream();//输出流
   InputStream is = s.getInputStream(); //输入流
   os.write("hello ,welcome you!".getBytes());
   byte[] buf = new byte[100];
   int len = is.read(buf);
   System.out.println(new String(buf,0,len));
   os.close();
   is.close();
   s.close();
  }catch(Exception e)
  {
   e.printStackTrace();
  }
}
public static void main(String[] args)
{
  server();
}
public static void server()
{
  try{
   ServerSocket ss = new ServerSocket(6000);
   System.out.println("服务器端启动...");
   //while死循环实现始终等待客户端请求,接受请求开启线程,提供服务
   while(true)
   {
    Socket s = ss.accept();
    new ServerrSocket(s).start();//紧接着走run方法,run方法结束,线程结束
   }
   //ss.close(); //持续侦听,所以不对服务器Socekt对象进行关闭
  
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
}
}

4>>缓冲流读写大量数据的处理和注意事项
import java.net.*;
import java.io.*;
//服务器端继承Thread,变成线程类
class ServerrSocket  extends Thread
{
private Socket s; //套接字属性
//带参构造函数指定哪个为套接字提供服务
ServerrSocket(Socket s)
{
  this.s = s;
}

//重写run方法
public void run()
{  
  try{

   /* //原始的输入流输出流方法
   OutputStream os = s.getOutputStream();//输出流
   InputStream is = s.getInputStream(); //输入流
   os.write("hello ,welcome you!".getBytes());
   byte[] buf = new byte[100];
   int len = is.read(buf);
   System.out.println(new String(buf,0,len));
   os.close();
   is.close();
   s.close();
   */

   /* 使用缓冲流读写数据 关键调用flush方法清空缓冲 或者最后将缓冲流对象关闭调用close方法
   //演示调用flush方法清空缓冲
   OutputStream os = s.getOutputStream();//输出流
   InputStream is = s.getInputStream(); //输入流
   BufferedOutputStream bos = new BufferedOutputStream(os);
   bos.write("hello ,welcome you!".getBytes());
   bos.flush();//必须清空缓冲,通过网络将数据送出去
   byte[] buf = new byte[100];
   int len = is.read(buf);
   System.out.println(new String(buf,0,len));
   */
   //演示调用close方法关闭缓冲
   OutputStream os = s.getOutputStream();//输出流
   InputStream is = s.getInputStream(); //输入流
   BufferedOutputStream bos = new BufferedOutputStream(os);
   bos.write("hello ,welcome you!".getBytes());
   byte[] buf = new byte[100];
   int len = is.read(buf);
   System.out.println(new String(buf,0,len));
   bos.close();
   //os.close();
   is.close();
   s.close();
  }catch(Exception e)
  {
   e.printStackTrace();
  }
}
public static void main(String[] args)
{
  server();
}
public static void server()
{
  try{
   ServerSocket ss = new ServerSocket(6000);
   System.out.println("服务器端启动...");
   //while死循环实现始终等待客户端请求,接受请求开启线程,提供服务
   while(true)
   {
    Socket s = ss.accept();
    new ServerrSocket(s).start();//紧接着走run方法,run方法结束,线程结束
   }
   //ss.close(); //持续侦听,所以不对服务器Socekt对象进行关闭

  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
}
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics