`
chenhua_1984
  • 浏览: 1238454 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

java Socket通信的学习笔记三

阅读更多

 先看一段服务器端的代码:

package com.socket.test;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) {
		try {
			System.out.println("开始侦听请求。。。。");
			ServerSocket serverSocket=new ServerSocket(3333);//服务器套接字
			Socket clientSocket=null;
			while(true){
				
				clientSocket=serverSocket.accept();//获得客户端的请求的Socket
				System.out.println("已侦听到了客户端的请求。。。。。");
				new ServerThread(clientSocket);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 下面是ServerThread的代码:

package com.socket.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerThread extends Thread {
	
	private Socket socket;
	private InputStream  clientInput;
	private OutputStream clientOutput;
	
	public ServerThread(Socket socket){
			this.socket=socket;
		try {
			this.clientInput=socket.getInputStream();
			this.clientOutput=socket.getOutputStream();
		} catch (IOException e) {
			e.printStackTrace();
		}
		this.start();
	}
	
	@Override
	public void run() {
		System.out.println("this is child class's run method.....");
		BufferedReader breader=new BufferedReader(new InputStreamReader(clientInput));
		try {
			String strLine=breader.readLine();
			if("over".equalsIgnoreCase(strLine)){
				PrintWriter printWriter=new PrintWriter(clientOutput,true);
				printWriter.println("over");
			}else{
				double side=Double.parseDouble(strLine);
				side=Double.parseDouble(strLine);
				System.out.println("Side of Square Received:"+side);
				double squareArea=side*side;
				String str="Side:"+side+"Square:"+squareArea;
				PrintWriter printWriter=new PrintWriter(clientOutput,true);
				printWriter.println(str);
				System.out.println("Finish sending to client...");
				
			}
			clientInput.close();
			clientOutput.close();
			socket.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 这段代码主要作用:

   1从构造函数中获得客户端的套接字请求,创建向客户端输入和输出的流。调用线程执行接下来的请求(this.start());

public ServerThread(Socket socket){
			this.socket=socket;
		try {
			this.clientInput=socket.getInputStream();
			this.clientOutput=socket.getOutputStream();
		} catch (IOException e) {
			e.printStackTrace();
		}
		this.start();
	}
 

   2通过bufferedReader获取客户端的输入并进行分析,假如是over,则向客户端输出over,并关闭,反之。则计算从客户端传来的数值,对应正方形的面积,并蒋结果返回到客户端。之后关闭。

if("over".equalsIgnoreCase(strLine)){
				PrintWriter printWriter=new PrintWriter(clientOutput,true);
				printWriter.println("over");
			}else{
				double side=Double.parseDouble(strLine);
				side=Double.parseDouble(strLine);
				System.out.println("Side of Square Received:"+side);
				double squareArea=side*side;
				String str="Side:"+side+"Square:"+squareArea;
				PrintWriter printWriter=new PrintWriter(clientOutput,true);
				printWriter.println(str);
				System.out.println("Finish sending to client...");
				
			}
 

注意PrintWriter的使用。。。。。。。。。

下面是客户端调用的代码:

package com.socket.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {

	public static void main(String[] args) {
		try {
			System.out.println("开始发送请求。。。。");
			Socket socket=new Socket("127.0.0.1",3333);
			BufferedReader bfReader=new BufferedReader(new InputStreamReader(System.in));
			System.out.println("Please input the line.....");
			String strLine=bfReader.readLine();
			
			OutputStream outputStream=socket.getOutputStream();
			InputStream  inputStream=socket.getInputStream();
			
			PrintWriter pw=new PrintWriter(outputStream,true);
			pw.println(strLine);
			BufferedReader br=new BufferedReader(new InputStreamReader(inputStream));
			System.out.println(br.readLine());
			socket.close();
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 代码分析:

Socket socket=new Socket("127.0.0.1",3333);
			BufferedReader bfReader=new BufferedReader(new InputStreamReader(System.in));
			System.out.println("Please input the line.....");
			String strLine=bfReader.readLine();

 建立与服务器的连接:

Socket socket=new Socket("127.0.0.1",3333);

构建缓从输入流:

BufferedReader bfReader=new BufferedReader(new InputStreamReader(System.in));
			System.out.println("Please input the line.....");
			String strLine=bfReader.readLine();

获得服务器的输出和输入流:

OutputStream outputStream=socket.getOutputStream();
			InputStream  inputStream=socket.getInputStream();

把输入发送到服务器:

PrintWriter pw=new PrintWriter(outputStream,true);
			pw.println(strLine);

获得服务器的输出:

 

BufferedReader br=new BufferedReader(new InputStreamReader(inputStream));
			System.out.println(br.readLine());

这里的

PrintWriter pw=new PrintWriter(outputStream,true);
			pw.println(strLine);

代码用outputStream我理解的是服务器的输出流对应的就是客户端的输入流,所以客户端发送到服务器端的数据就用outputStream,而获取服务器的输出则用inputStream,感觉这有点怪。不敢肯定是否对?

参考java API:

public class PrintWriter
extends Writer

向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入

构造方法摘要
PrintWriter (File  file)
          使用指定文件创建不具有自动行刷新的新 PrintWriter。
PrintWriter (File  file, String  csn)
          创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。
PrintWriter (OutputStream  out)
          根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。
PrintWriter (OutputStream  out, boolean autoFlush)
          通过现有的 OutputStream 创建新的 PrintWriter。
PrintWriter (String  fileName)
          创建具有指定文件名称且不带自动行刷新的新 PrintWriter。
PrintWriter (String  fileName, String  csn)
          创建具有指定文件名称和字符集且不带自动行刷新的新 PrintWriter。
PrintWriter (Writer  out)
          创建不带自动行刷新的新 PrintWriter。

PrintWriter (Writer  out, boolean autoFlush)
          创建新 PrintWriter。

 

 

分享到:
评论

相关推荐

    JAVA网络编程

    Java网络编程---IO部分学习笔记整理 .doc Java网络编程基础 Datagram类使用方法 (1) .doc Java网络编程基础 InetAddress类的使用.doc Java网络编程基础 ServerSocket类使用.doc 《JAVA编程规范》.doc Java基础 三...

    [Java]详解Socket和ServerSocket学习笔记

    即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求,这会,Socket对于我们来说就非常实用了。本篇文章主要介绍了Socket和ServerSocket,有兴趣的可以了解一下。

    Android学习笔记含JNI、USB和ftdi通信方式详解

    项目四 多线程文件下载 25 项目五 Android自定义树形菜单 26 ...项目八 Android USB Socket通信 27 学习四 Android and MCU Communication 43 一、 uses USB via FTDI serial card 43 二、 uses Uart(through JNI) 44

    socket 编程 网络编程资料大全 给力

    网络通信协议,网络通信基础知识,socket网络编程的一些基础知识,Socket网络编程学习笔记,网络编程总结,2011-学习资料大全:java_socket编程,学习网络编程的十个步骤,socket编程入门(经典版),Unix_网络编程...

    整理后java开发全套达内学习笔记(含练习)

    Socket [java] 网络套接字['sɒkit] stack n.堆栈 [stæk] (对应 heap 堆) statement 程序语句; 语句 ['steitmәnt]' n. 陈述,指令 subclass n.子类 ['sʌbklɑ:s]' (supertype 父类) switch (关键字) 选择语句。...

    自考Java语言程序设计(一)串讲笔记(珍藏版).pdf

    在自考Java语言程序设计(一)串讲笔记(珍藏版)中,我们将学习Java的基本概念、语法结构、面向对象编程、异常处理、多线程编程、IO操作、网络编程等方面的知识。 第1章 Java基础 * Java语言的历史和发展 * Java...

    svm实现代码java代码

    支持向量机(svm)是一种常见的算法,但在工业现场中,我们不可能把实验室的笔记本带入现场进行算法测试,因此有必要做一套实时的测量预测系统,这里通过socket通信来仿照实时的产生数据进行了模拟,实现了java实时...

    JAVA 网络 编程

    别人的学习笔记,发来给大家共享,主要介绍了JAVA中Socket多线程的客户端和服务通信。

    水木清华站∶Java版精华区 含jsp及js等集合.chm

    [目录]Java学习笔记(推荐) 6. [目录]JDBC文档 7. [目录]RMI 文档 2. [目录]Java资源(文档-书籍-下载-注册码) 1. [目录]License 和注册码 2. [目录]好书推荐 3. [目录]关于Java的...

    java多线程tcpsocketserver源码-netty-learning:网络学习

    java多线程tcp socket server源码@Netty 笔记 1. 内蒂 网络应用框架 特征 设计 支持多种传输类型 事件模型 高度可定制的线程模型 表现 高吞吐量,低延迟 更少的资源消耗 最小化内存拷贝 安全SSL/TLS 支持 建筑学 核 ...

    Java聊天室的设计与实现设计开题报告.doc

    通过本题目的学习,可以更好的把计算机网络" " "课程中学到的理论知识应用于实际,编制出符合实际需要的网络通信软件。同时可 " " "以了解聊天程序的开发流程,还能很大的提高自己的开发技术,必将对我以后的工" " ...

    A01JFrame.zip

    是我这学期做的课程设计的Java源代码,课题是基于Socket通信的多人聊天室。可能得用idea打开,,等学习笔记整理好后会把笔记传到博客里

    详解node child_process模块学习笔记

    NodeJs是一个单进程的语言,不能像Java那样可以创建多线程来并发执行。当然在大部分情况下,NodeJs是不需要并发执行的,因为它是事件驱动性永不阻塞。但单进程也有个问题就是不能充分利用CPU的多核机制,根据前人的...

    Java网络编程精讲

    本课程是《Java初级至应用》系统课程的第十一章,全套课程精细讲解,课程超过其他机构30%的课程量,经过我们全套课程系统学习的同学,可轻松从事Java工程师或系统架构师岗位,课程提供全套代码笔记其它相关素材及...

Global site tag (gtag.js) - Google Analytics