Flash 在8.0的时候已经有了关于socket 一些功能,但是功能还局限在一定角落里面。在9.0的 player 发展后,socket处理有了很大的改善,可以发送一些二进制的数据,从而通信能力大大提高。在说socket编程之前,我们还是不能忘记,flash在服务器领域还是“小学生”,不过在客户端领域,它就是一个“研究生”;
首先我们看一些利用java做客户端,java做服务器来搭建一个最简单的通信。所用到的知识,包括输入输出流,还有Socket知识点。
原理: 通信的过程,是一个双工的过程,也就是说,客户端既然 发送端 也是接收端 。同样服务器也是一样。
从这里可以看出,客户端的输入流 就是服务器的输出流所发送来的信息。而服务器的输入流同样是客户端所发送来的
一,客户端
view plaincopy to clipboardprint?
package com;
import java.net.*;
import java.io.*;
public class TcpClient {
public static void main(String[] args) {
String host="127.0.0.1";
int port =8001;
try {
Socket s = new Socket(host,port);
InputStream ips =s.getInputStream();
OutputStream ops=s.getOutputStream();
BufferedReader brNet = new BufferedReader(
new InputStreamReader(ips));//输入流
PrintWriter pw = new PrintWriter(ops,true);
BufferedReader brKeyBoard = new BufferedReader(
new InputStreamReader(System.in));//键盘缓冲
while(true){
String strWord =brKeyBoard.readLine();
pw.println("Jim:"+strWord+"\n");
System.out.println(brNet.readLine());
}
//pw.close();
// brNet.close();
// brKeyBoard.close();
// s.close();
} catch (UnknownHostException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
package com;
import java.net.*;
import java.io.*;
public class TcpClient {
public static void main(String[] args) {
String host="127.0.0.1";
int port =8001;
try {
Socket s = new Socket(host,port);
InputStream ips =s.getInputStream();
OutputStream ops=s.getOutputStream();
BufferedReader brNet = new BufferedReader(
new InputStreamReader(ips));//输入流
PrintWriter pw = new PrintWriter(ops,true);
BufferedReader brKeyBoard = new BufferedReader(
new InputStreamReader(System.in));//键盘缓冲
while(true){
String strWord =brKeyBoard.readLine();
pw.println("Jim:"+strWord+"\n");
System.out.println(brNet.readLine());
}
//pw.close();
// brNet.close();
// brKeyBoard.close();
// s.close();
} catch (UnknownHostException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
程序的入口:是main 函数。
在main函数里面创建一个socket对象: Socket s = new Socket(host,port);
并写上两个参数,一个是主机名,也是ip ,而port 就是端口,指定一个端口。(这个端口要在允许的范围填写)
接下来,创建两个输入输出流:
InputStream ips =s.getInputStream();
OutputStream ops=s.getOutputStream();
通过Socket类的 getInputStream 和getOutputStream 返回输入输出流信息
为了使效率提高,在客户端引用缓冲。BufferedReader类用于缓冲使用。
BufferedReader brNet = new BufferedReader(
new InputStreamReader(ips));//输入流
BufferedReader brKeyBoard = new BufferedReader(
new InputStreamReader(System.in));//键盘缓冲
下一步 接收键盘输入的信息 以及 发送信息到服务器端里面去:
while(true){
String strWord =brKeyBoard.readLine();
pw.println("Jim:"+strWord+"\n");
System.out.println(brNet.readLine());
}
Socket 会抛出OException 异常,所以要进行捕捉。try{}catch()处理机制
二 服务器:
view plaincopy to clipboardprint?
package com;
import java.net.*;
import java.io.*;
public class Server {
public static void main(String[] args) {
PrintWriter os=null;
try{
ServerSocket ss=new ServerSocket(8001);
System.out.println("等待连接....");
Socket sk=ss.accept();
System.out.println("连接成功....");
BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
System.out.println("获取里面的内容......");
//等待接受信息
os = new PrintWriter(sk.getOutputStream());
String word=null ;
//发送信息
while((word=br.readLine())!=null)
{
os.println("你好我是服务器");
os.flush();
System.out.println("内容:" + word);
}
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
}
package com;
import java.net.*;
import java.io.*;
public class Server {
public static void main(String[] args) {
PrintWriter os=null;
try{
ServerSocket ss=new ServerSocket(8001);
System.out.println("等待连接....");
Socket sk=ss.accept();
System.out.println("连接成功....");
BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
System.out.println("获取里面的内容......");
//等待接受信息
os = new PrintWriter(sk.getOutputStream());
String word=null ;
//发送信息
while((word=br.readLine())!=null)
{
os.println("你好我是服务器");
os.flush();
System.out.println("内容:" + word);
}
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
}
服务器搭建其实也很简单
首先创建一个ServerSocket ss=new ServerSocket(8001);
ServerSocket 对象,然后调用 accept()方法
Socket sk=ss.accept();一直阻塞,直到返回Socket对象这样我们就可以像在客户端一样进行输入流和输入出的处理。并返回输出结果 缓冲等等
输出结果:将客户端发送的字符串进行输出
while((word=br.readLine())!=null)
{
os.println("你好我是服务器");
os.flush();
System.out.println("内容:" + word);
}
但问题其实还是有的,在客户端发送的时候,由于没有过滤掉回车符所以在服务器里面会输出两个结果
等待连接....
连接成功....
获取里面的内容......
内容:Jim:dd
内容:
注意一个是有内容,一个是没有内容导致这个Tcp的通信出现问题。
接下来,我们尝试搭建flash客户端