前言:
学习是一个学习新知,思考新知,运用新知最后总结新知的过程。初识网络编程,经常会有闭塞无从下手的感觉。下面以一个简单的可以在两个控制台上通信(有兴趣有条件的可以在两台电脑上尝试通信)的简单小程序作为引入,了解网络编程,从而达到简单入门。当然,该程序也支持加入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();
}
}
}
由于接收消息和发送消息是同步进行而不是先后进行,因此需要多线程来实现聊天功能。
总而言之,一个聊天功能的小程序至少要熟练多线程知识,网络编程知识,输入输出流的知识才可以学起来游刃有余。欢迎在此代码的基础上改进添加新功能。