`
chenhua_1984
  • 浏览: 1246497 次
  • 性别: 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学习笔记:Socket通信详解 #### 一、Socket通信概念与原理 Socket通信是Java网络编程中的核心概念,它提供了在不同计算机之间进行数据交换的能力。Socket可以被视为两个程序间进行通信的端点,一个Socket...

    Java 学习笔记Java学习笔记

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。

    java学习笔记markdown

    【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...

    学习笔记:多线程Java Socket编程示例

    总结来说,这个学习笔记提供了一个使用Java Socket编程实现多线程服务器的示例,它演示了如何利用ExecutorService创建线程池来处理并发连接,是理解Java并发编程和网络通信的一个实用案例。虽然这是一个学习笔记,但...

    JAVA学习笔记 林信良

    《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...

    java学习笔记-Scokect.pdf

    Java学习笔记-Scoket.pdf是关于Java编程语言中Socket编程的学习笔记,涵盖了Socket编程的基础知识、Java中Socket的使用、Socket通信的原理及应用等方面的内容。 Socket编程的基础知识 在Java编程语言中,Socket是...

    Java基础尚硅谷宋红康学习笔记

    5. **输入/输出**:Java的I/O流系统支持文件操作和网络通信,如FileReader、FileWriter、BufferedReader、BufferedWriter以及Socket、ServerSocket等类。 6. **字符串处理**:String类在Java中扮演重要角色,提供了...

    Java学习笔记(源码)

    3. **异常处理**:Java的异常处理机制是其强大的特性之一,学习笔记会讲解如何使用try-catch-finally语句块来捕获和处理程序运行时可能出现的错误。 4. **集合框架**:Java集合框架是存储和操作对象的重要工具,...

    Java JDK 6学习笔记_pdf版(附课本代码)

    这份“Java JDK 6学习笔记”涵盖了从基础到高级的各种主题,是Java初学者和进阶者的重要参考资料。以下是笔记中可能包含的一些关键知识点: 1. **安装与配置**:介绍如何在不同操作系统(如Windows、Linux和Mac OS...

    Socket基础知识笔记

    Socket通信主要基于两种协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP是一种面向连接的、可靠的传输协议,确保数据的顺序和完整性;而UDP是无连接的、不可靠的,速度快但不保证数据的到达。 3. **Socket...

    java面试题 学习笔记

    Java面试题及学习笔记概述 Java作为一种广泛应用的编程语言,其面试题库广泛且深入,涵盖了从基础语法到高级特性的各个层面。本篇将基于常见的Java面试问题,结合学习笔记,深入探讨Java的核心概念和技术。 一、...

    Java学习笔记(必看经典).doc

    6. **输入/输出流**:Java提供了强大的I/O流系统,支持文件读写、网络通信和数据序列化等操作,如FileInputStream和FileOutputStream用于文件操作,Socket和ServerSocket用于网络编程。 7. **多线程**:Java内置了...

    良葛格JAVA 学习笔记

    《良葛格JAVA 学习笔记》是由知名IT专家林信良,网名“良葛格”,在台湾大学电机工程学系的深厚学术背景基础上,结合其作为SUN教育训练中心讲师的丰富教学经验编写的。他的著作还包括《Spring 技术手册》,并且他...

    林信良java学习笔记

    《林信良Java学习笔记》是一本深受程序员喜爱的Java学习资源,尤其因其繁体字版,对于中文读者来说,提供了更为亲切的阅读体验。这本书深入浅出地讲解了Java编程语言的基础知识和高级特性,旨在帮助初学者快速掌握...

    良葛格java学习笔记

    《良葛格java学习笔记》是一份集合了Java学习精华的资源,主要针对初学者和对Java编程感兴趣的读者。这份笔记是由用户从良葛格的网站上精心整理并转化为CHM格式,便于阅读和查阅。CHM(Compiled Help Manual)是微软...

    java学习笔记JDK6.0课件和代码

    这个压缩包中包含的"java学习笔记JDK6课件和课本代码"是学习JDK 6.0的重要参考资料,可以帮助你深入理解Java编程的核心概念和实践技巧。 1. **Java基础**:Java是一种面向对象的编程语言,它的基础包括类、对象、...

    Java学习笔记(整理)

    11. **网络编程**:Java的Socket和ServerSocket类可用于网络通信,实现客户端-服务器模式的应用。 12. **反射机制**:反射允许在运行时检查类的信息,创建和调用对象,是Java动态性的重要体现。 13. **泛型**:...

    java基础知识学习笔记

    在网络编程方面,Java提供Socket编程接口,可以创建客户端和服务端进行通信。你会学习如何创建TCP和UDP套接字,实现数据的发送和接收。 多线程是Java的另一个强项。Java内置了对多线程的支持,通过Thread类和...

    Socket网络编程学习笔记.zip

    本学习笔记将带你深入理解这一领域,特别是通过Socket接口进行的网络通信。Socket是操作系统提供的一种通信机制,它允许应用程序创建并管理网络连接,进行数据传输。 **TCP/IP协议族** TCP/IP(Transmission ...

    林信良 jdk6 java学习笔记

    《林信良 jdk6 java学习笔记》是一本专注于Java编程语言的学习资料,特别针对Java Development Kit (JDK) 6版本进行了深入讲解。作者林信良是一位在Java领域有深厚造诣的专业人士,他的这部作品旨在帮助读者掌握Java...

Global site tag (gtag.js) - Google Analytics