java学习11.26~11.29

1、io流

这几天看了io流实现输入、输出的几种方式,首先是字节流:输入流InputStream、输出流OutputStream,字节流是以一个字节(1B=8bit)进行数据传输;然后是字符流:输入流Reader、输出流Writer,字符流是以两个字节(2B=16bit)进行数据传输,其中又有高效输入输出流BuferedReader、BufferedWriter。我觉得我了解的很基础
注意字符流对象,如果不.close()关闭流,数据流会在缓存区,而如果此时需要获得数据,需要对流对象.fluse()操作来获得流中的数据
疑惑??现阶段我感觉自己还有很多搞不清楚的地方,怎么确定使用哪个流来进行数据的传输?
例如下面这段代码,使用装饰者模式,但是我应该怎么选择哪个是装饰者,哪个是被装饰者,装饰者模式是什么?
关于这种流的使用我不知道理解的对不对,你想要获得的类型流它就是装饰者,而怎么去获取这种类型流的具体实现就是被装饰者。实现语句如下:
装饰者 decorate=new 装饰者(new 被装饰者())
而这种语句的具体实现需要慢慢的熟悉IO流的API文档

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

IO流
在搜索上诉问题的答案新的问题有跳出来了,NIO、BIO是什么?在后面的学习中我将带着这些疑惑慢慢的去解决。

2、UDP

只是发,不管你接不接收得到
主要学习DatagramSocket和DatagramPacket的的用法
客户端:

InetAddress adr = InetAddress.getByName("192.168.22.222");
		System.out.println(adr.getHostName());
		DatagramSocket ds = new DatagramSocket();//建立udp协议对象
		String s = "coming";
		byte[] b = s.getBytes();
		DatagramPacket dp = new DatagramPacket(b, b.length, adr, 8888);//将需要传输的内容打包并填写到指定的主机端口
		ds.send(dp);//发送数据
//	adr.getHostAddress();
		ds.close();//关闭客户端

服务端:

DatagramSocket ds = new DatagramSocket(8888);//建立udp协议对象,并指定接收端口号
			byte[] bys = new byte[1024];
			DatagramPacket p = new DatagramPacket(bys, 1024);
			ds.receive(p);//收到包数据
			InetAddress asr = p.getAddress();
			System.out.println(asr.getHostAddress());
			System.out.println(new String(p.getData(), 0, p.getData().length));//解析包中的数据
			ds.close();//关闭服务器端,一般并不需要

3、TCP

三次握手:
第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
客户端

package com.javaSE;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PipedReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class demo12 {
	public static void main(String[] args) throws IOException {
//		method();
//发送数据并接收从服务器返回的数据
		Socket ss=new Socket("192.168.5.9", 10024);
		BufferedReader is=new BufferedReader(new InputStreamReader(System.in));
		OutputStream os=ss.getOutputStream();
		byte[] b=is.readLine().getBytes();
		os.write(b, 0, b.length);
		InputStream s=ss.getInputStream();
		s.read(b);
		System.out.println(new String(b,0,b.length));
		ss.close();
	}

	private static void method() throws UnknownHostException, IOException {
	//发送数据
		Socket se = new Socket("192.168.5.9", 10024);
		OutputStream os = se.getOutputStream();
		byte[] b = "im coming,tcp".getBytes();
		os.write(b);
		InputStream is = se.getInputStream();
		byte[] b1 = new byte[1024];		
		while (is.read(b1) != -1) {
			System.out.println(new String(b1, 0, b1.length));
		}
		os.close();
		se.close();
	}

}

服务端:

package com.javaSE;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;

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

public class demo13 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		@SuppressWarnings("resource")
		ServerSocket ss = new ServerSocket(10024);

		Socket sc = ss.accept();
		InputStream is = sc.getInputStream();
		byte[] b = new byte[1024];
		OutputStream os = sc.getOutputStream();
		while (is.read(b) != -1) {
			os.write(b, 0, b.length);
			System.out.println(new String(b, 0, b.length));
			
		}
//		os.close();
		sc.close();
//		ss.close();
	}

}

4、算法题

给定单链表,将所有奇数节点连接在一起,然后将偶数节点连接在一起。 请注意,这里我们讨论的是节点编号,而不是节点中的值。
思路:一开始我理解成了节点中的值,然后想只要发现两组不同的奇偶数排列满足,便将后面符合的数插入的前面的节点中。。。。后面去阅读别人笔记,发现没仔细审题
正解:新建两个单链表,根据遍历节点的编号依次将原有的节点插入到两个新链表中,然后合并两个新链表输出。

public ListNode oddEvenList(ListNode head) {
        // write your code her
     ListNode dummyOdd = new ListNode(0);
        ListNode keepDummyOdd = dummyOdd;
        ListNode dummyEven = new ListNode(9);
        ListNode keepDummyEven = dummyEven;
        
        ListNode pointer = head;
        
        while (pointer != null) {
            dummyOdd.next = pointer;
            dummyOdd = dummyOdd.next;
            dummyEven.next = pointer.next;
            dummyEven = dummyEven.next;
            if (pointer.next == null) {
                break;
            }
            pointer = pointer.next.next;
        }
        
        dummyOdd.next = keepDummyEven.next;
        return keepDummyOdd.next;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值