JAVA初入门——Socket,Thread,多线程Socket

 http://blog.csdn.net/heqichanggg/article/details/5513959

这两天学习了一下JAVA中关于Socket和线程的一些知识,现在主要整理一下。

 

1.Socket


Java的服务端和客户端编写都非常简单,创建服务端使用的是ServerSocket的,然后使用accept()的方法进行监听,并返回一个Socket的对象。客户端的话直接使用Socket类进行连接服务端。连接就这么简单。但我个人觉得难点在于传输信息上,Java本来封装好了很多输入输出流来方便程序员调用,但它的类的初始化中在嵌套各类的方法就觉得恶心了,对于初学者很难马上掌握。而我是这样理解的,Socket下我们通过getInputStream()方法来获得信息,通过getOutputSteram()方法来发送信息。

 

下面我们简单的实现一个单向的,客户端向服务端发送信息,只能单个连接的简单网络程序,最主要是来感受一下Java中的网络编程。

 

服务端


 

 [java] view plaincopyprint?package src; 
 
import java.io.*; 
import java.net.*; 
 
/**
 * Server
 * 
 * @author heqichang 服务端
 * 
 * */ 
public class Server { 
 
    public static void main(String[] args) { 
        try { 
            // 创建一个服务端,绑定在8899端口  
            ServerSocket serverSocket = new ServerSocket(8899); 
 
            // 开始在服务端开始监听  
            Socket socket = serverSocket.accept(); 
 
            // 定义一个流来接收信息  
            BufferedReader br = new BufferedReader(new InputStreamReader(socket 
                    .getInputStream())); 
 
            while (true) { 
                //利用循环来不断输出获得的信息  
                System.out.println(br.readLine()); 
            } 
        } catch (IOException e) { 
            // TODO Auto-generated catch block  
            e.printStackTrace(); 
        } 
    } 

package src;

import java.io.*;
import java.net.*;

/**
 * Server
 *
 * @author heqichang 服务端
 *
 * */
public class Server {

 public static void main(String[] args) {
  try {
   // 创建一个服务端,绑定在8899端口
   ServerSocket serverSocket = new ServerSocket(8899);

   // 开始在服务端开始监听
   Socket socket = serverSocket.accept();

   // 定义一个流来接收信息
   BufferedReader br = new BufferedReader(new InputStreamReader(socket
     .getInputStream()));

   while (true) {
    //利用循环来不断输出获得的信息
    System.out.println(br.readLine());
   }
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}
 

 

客户端


[java] view plaincopyprint?package src; 
 
import java.io.*; 
import java.net.*; 
 
/**
 * Client
 * 
 * @author heqichang 客户端
 * 
 * */ 
public class Client { 
 
    public static void main(String[] args) { 
        try { 
            // 向本地的8899发出客户连接  
            Socket socket = new Socket("127.0.0.1", 8899); 
 
            //定义一个从标准输入设备输入的流  
            BufferedReader br = new BufferedReader(new InputStreamReader( 
                    System.in)); 
             
            //发送的流  
            PrintWriter pw = new PrintWriter(socket.getOutputStream()); 
 
            while (true) { 
                 
                //循环发送信息给服务端  
                pw.println(br.readLine()); 
                 
                //不要忘记最重要的刷新  
                pw.flush(); 
            } 
        } catch (UnknownHostException e) { 
            // TODO Auto-generated catch block  
            e.printStackTrace(); 
        } catch (IOException e) { 
            // TODO Auto-generated catch block  
            e.printStackTrace(); 
        } 
 
    } 

package src;

import java.io.*;
import java.net.*;

/**
 * Client
 *
 * @author heqichang 客户端
 *
 * */
public class Client {

 public static void main(String[] args) {
  try {
   // 向本地的8899发出客户连接
   Socket socket = new Socket("127.0.0.1", 8899);

   //定义一个从标准输入设备输入的流
   BufferedReader br = new BufferedReader(new InputStreamReader(
     System.in));
   
   //发送的流
   PrintWriter pw = new PrintWriter(socket.getOutputStream());

   while (true) {
    
    //循环发送信息给服务端
    pw.println(br.readLine());
    
    //不要忘记最重要的刷新
    pw.flush();
   }
  } catch (UnknownHostException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }
}
 

 

自己上面所写的例子不怎么好,没有将连接进行关闭的操作。

以后自己再完善。

 


2.Thread


在Java语言中实现多线程有两种方法,第一种继承Thread类,重载Run()的方法,并用Start()方法进行调用。但上述这种方法在你需要继承其它类的情况下就不能使用了。第二种方法是实现Runnable的接口。下面都来演示一下代码如何实现。


第一种,继承Thread方法

[java] view plaincopyprint?package src; 
 
/**
 * 
 * @author heqichang
 * 
 * */ 
public class ThreadRun extends Thread { 
    private int num; 
 
    public ThreadRun(int i) { 
        num = i; 
    } 
 
    public void run() { 
        System.out.println(num); 
    } 
 
    public static void main(String[] args) { 
        for (int i = 0; i < 3; i++) { 
            ThreadRun thread = new ThreadRun(i); 
            thread.start(); 
        } 
    } 

package src;

/**
 *
 * @author heqichang
 *
 * */
public class ThreadRun extends Thread {
 private int num;

 public ThreadRun(int i) {
  num = i;
 }

 public void run() {
  System.out.println(num);
 }

 public static void main(String[] args) {
  for (int i = 0; i < 3; i++) {
   ThreadRun thread = new ThreadRun(i);
   thread.start();
  }
 }
}
 


第二种,实现Runnable接口方法

[java] view plaincopyprint?package src; 
 
/**
 * 
 * @author heqichang
 * 
 * */ 
public class Run implements Runnable { 
 
    private int num; 
 
    public Run(int i) { 
        num = i; 
    } 
 
    @Override 
    public void run() { 
        System.out.println(num); 
    } 
 
    public static void main(String[] args) { 
        for (int i = 0; i < 3; i++) { 
            new Thread(new Run(i)).start(); 
        } 
    } 

package src;

/**
 *
 * @author heqichang
 *
 * */
public class Run implements Runnable {

 private int num;

 public Run(int i) {
  num = i;
 }

 @Override
 public void run() {
  System.out.println(num);
 }

 public static void main(String[] args) {
  for (int i = 0; i < 3; i++) {
   new Thread(new Run(i)).start();
  }
 }
}
 

 


3.下面我们来结合多线程和SOCKET来编写一个可以实现多连接服务端的程序


服务端程序如下:


[java] view plaincopyprint?import java.io.*; 
import java.net.*; 
 
/**
 * 
 * @author heqichang
 * 服务端
 * */ 
public class ThreadSocketServer extends Thread { 
 
    Socket server; 
     
    //保存服务端的姓名  
    static String name = new String(); 
 
    public void run() { 
        try { 
             
            //启动一个线程来接收客户端信息  
            ThreadServer thread = new ThreadServer(server); 
            thread.start(); 
 
            BufferedReader br = new BufferedReader(new InputStreamReader( 
                    System.in)); 
            PrintWriter pw = new PrintWriter(server.getOutputStream()); 
             
            //第一次发送自己的姓名给客户端  
            pw.println(name); 
             
            //循环发送信息给客户端  
            while (true) { 
                String s = br.readLine(); 
                pw.println(s); 
                pw.flush(); 
            } 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
 
    } 
 
    public ThreadSocketServer(Socket s) { 
        this.server = s; 
    } 
 
    public static void main(String[] args) throws IOException { 
         
        //绑定服务端在9999端口  
        ServerSocket server = new ServerSocket(9999); 
        Socket socket; 
 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
        System.out.print("请输入您的姓名:>"); 
        name = br.readLine(); 
 
        while (true) { 
             
            //监听客户端程序  
            socket = server.accept(); 
             
            //一个客户端连接后启动一个线程进行处理  
            ThreadSocketServer thread = new ThreadSocketServer(socket); 
            thread.start(); 
        } 
    } 

import java.io.*;
import java.net.*;

/**
 *
 * @author heqichang
 * 服务端
 * */
public class ThreadSocketServer extends Thread {

 Socket server;
 
 //保存服务端的姓名
 static String name = new String();

 public void run() {
  try {
   
   //启动一个线程来接收客户端信息
   ThreadServer thread = new ThreadServer(server);
   thread.start();

   BufferedReader br = new BufferedReader(new InputStreamReader(
     System.in));
   PrintWriter pw = new PrintWriter(server.getOutputStream());
   
   //第一次发送自己的姓名给客户端
   pw.println(name);
   
   //循环发送信息给客户端
   while (true) {
    String s = br.readLine();
    pw.println(s);
    pw.flush();
   }
  } catch (IOException e) {
   e.printStackTrace();
  }

 }

 public ThreadSocketServer(Socket s) {
  this.server = s;
 }

 public static void main(String[] args) throws IOException {
  
  //绑定服务端在9999端口
  ServerSocket server = new ServerSocket(9999);
  Socket socket;

  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  System.out.print("请输入您的姓名:>");
  name = br.readLine();

  while (true) {
   
   //监听客户端程序
   socket = server.accept();
   
   //一个客户端连接后启动一个线程进行处理
   ThreadSocketServer thread = new ThreadSocketServer(socket);
   thread.start();
  }
 }
}
 


[java] view plaincopyprint?import java.io.*; 
import java.net.*; 
 
/**
 * 
 * @author heqichang
 * 服务端接收信息线程
 * */ 
public class ThreadServer extends Thread{ 
     
    Socket serverSocket; 
     
    public void run() 
    { 
        try { 
            BufferedReader br=new BufferedReader(new InputStreamReader(serverSocket.getInputStream())); 
            String read=new String(); 
             
            //接受客户端的姓名信息  
            String name=br.readLine(); 
             
            //循环接受客户端信息  
            while(true) 
            { 
                read=br.readLine(); 
                System.out.println(name+"说:"+read); 
                 
                if(read.equals("bye")) 
                { 
                    break; 
                } 
            } 
             
            br.close(); 
            serverSocket.close(); 
             
        } catch (IOException e) { 
            // TODO Auto-generated catch block  
            e.printStackTrace(); 
        } 
    } 
     
    public ThreadServer(Socket server) 
    { 
        serverSocket=server; 
    } 

import java.io.*;
import java.net.*;

/**
 *
 * @author heqichang
 * 服务端接收信息线程
 * */
public class ThreadServer extends Thread{
 
 Socket serverSocket;
 
 public void run()
 {
  try {
   BufferedReader br=new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
   String read=new String();
   
   //接受客户端的姓名信息
   String name=br.readLine();
   
   //循环接受客户端信息
   while(true)
   {
    read=br.readLine();
    System.out.println(name+"说:"+read);
    
    if(read.equals("bye"))
    {
     break;
    }
   }
   
   br.close();
   serverSocket.close();
   
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
 public ThreadServer(Socket server)
 {
  serverSocket=server;
 }
}
 


客户端程序:


[java] view plaincopyprint?import java.io.*; 
import java.net.*; 
/**
 * 
 * @author heqichang
 * 客户端
 * */ 
public class ThreadSocketClient extends Thread{ 
     
    static Socket socket; 
     
    public void run() 
    { 
        try { 
            BufferedReader br2=new BufferedReader(new InputStreamReader(socket.getInputStream())); 
            String read=new String(); 
             
            //接受来自服务端的姓名信息  
            String name=br2.readLine(); 
             
            //接受来自服务端的信息  
            while(true) 
            { 
                read=br2.readLine(); 
                System.out.println(name+"说:"+read); 
            } 
             
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
      
     
    public static void main(String[] args) throws IOException 
    { 
        socket=new Socket("127.0.0.1",9999); 
         
        BufferedReader inputName=new BufferedReader(new InputStreamReader(System.in)); 
         
        System.out.print("已连接上服务端,请输入你的姓名:"); 
        String name=inputName.readLine(); 
         
        //启动一个线程进行接收服务端信息  
        ThreadSocketClient thread=new ThreadSocketClient(); 
        thread.start(); 
         
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
        PrintWriter pw=new PrintWriter(socket.getOutputStream()); 
         
        //发送给服务端客户端的姓名信息  
        pw.println(name); 
         
        String info=new String(); 
         
        //发送消息给服务端  
        while(!info.equals("bye")) 
        { 
            info=br.readLine(); 
            pw.println(info); 
            pw.flush(); 
        } 
         
        pw.close(); 
        socket.close(); 
    } 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值