Java网络编程之TCP协议实现简单通信

前言:
学习是一个学习新知,思考新知,运用新知最后总结新知的过程。初识网络编程,经常会有闭塞无从下手的感觉。下面以一个简单的可以在两个控制台上通信(有兴趣有条件的可以在两台电脑上尝试通信)的简单小程序作为引入,了解网络编程,从而达到简单入门。当然,该程序也支持加入swing等知识进行扩展。

一.通信示意图

简单的理解就是服务器的输入流就是客户端的输出流,服务器的输入流就是客户端的输出流。客户端的和服务器同理。事实上服务器和客户端并没有本质上的差距,甚至可以把服务器当做一个客户端,本例就是如此。当然也可以把服务器当做一个中转站,让服务·器向客户端传递消息显然也是可行的。客户端的输入流

二.代码引入

发送消息的代码:

      String send = null;
      BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
      //把输入的字符存入缓冲区内
      PrintStream ps = new PrintStream(s.getOutputStream());
      //获取输出的通道
      while((send = br1.readLine()) != null)
      { 
    	  ps.println(send);
    	  
      }
      //只要可以读取到字符,就输出到输出流中

接受消息的代码:

        private Socket s;
	    BufferedReader  br = new BufferedReader(new InputStreamReader(s.getInputStream()));
	    //获取输入流,存入缓冲区
		String connect = null;
		while((connect = br.readLine()) != null)
		{
			System.out.println(connect);
		}
		//读取缓冲区的内容,输出到控制台上
	

三.总体的服务器和客户端的通信的实现代码如下

服务器的发送消息功能的实现:

import java.net.*;
import java.io.*;
public class Server2 {
	
	
     
     public static void main(String [] args) throws IOException
     {
    	 ServerSocket ss = new ServerSocket(8001);
         Socket s = ss.accept();
    	 new Thread(new Server2Thread(s)).start();
    	 String se = null;
    	 BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
    	 PrintStream ps = new PrintStream(s.getOutputStream());
    	 while((se = br1.readLine()) != null)
    	 {
    		 ps.println(se);
    	 }
     ss.close();
     s.close();
     br1.close();
     ps.close();	
     }
}

服务器接受消息功能的实现:

import java.net.*;
import java.io.*;
public class Server2Thread implements Runnable {
    
	private Socket s;
	BufferedReader br = null;
	public Server2Thread(Socket s) throws IOException
	{
		this.s = s;
		 br = new BufferedReader(new InputStreamReader(s.getInputStream()));
	}
	public void run() {
	try
	{
		String connect = null;
		while((connect = br.readLine()) != null)
		{
			System.out.println("客户端说" + "\n" + connect);
		}
	}
  catch(Exception e)
	{
	  e.printStackTrace();
	}
}
}

客户端发送消息的实现:

import java.net.*;
import java.io.*;
public class Client2 {
	
   public static void main(String [] args) throws IOException
   {
	  Socket s = new Socket("127.0.0.1" , 8001);
	  new Thread(new Client2Thread(s)).start();
      String send = null;
      BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
      PrintStream ps = new PrintStream(s.getOutputStream());
      while((send = br1.readLine()) != null)
      { 
    	  ps.println(send);
    	  
      }
      s.close();
      br1.close();
      ps.close();
}

	
}

客户端接收消息的实现:


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

public class Client2Thread implements Runnable {
	private Socket s;
	BufferedReader br = null;
	public Client2Thread(Socket s) throws IOException
	{
		this.s = s;
		 br = new BufferedReader(new InputStreamReader(s.getInputStream()));
	}
	public void run() {
	try
	{
		String connect = null;
		while((connect = br.readLine()) != null)
		{
			System.out.println("服务器说:" + "\n" + connect);
		}
	}
  catch(Exception e)
	{
	  e.printStackTrace();
	}
}
}

由于接收消息和发送消息是同步进行而不是先后进行,因此需要多线程来实现聊天功能。
总而言之,一个聊天功能的小程序至少要熟练多线程知识,网络编程知识,输入输出流的知识才可以学起来游刃有余。欢迎在此代码的基础上改进添加新功能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值